Mockito:验证传递给构造函数的参数

问题描述 投票:0回答:2

我正在尝试弄清楚如何验证传递给 Mockito 中模拟构造函数的参数。我的代码的简化版本是:

class Mocked {
    Mocked(String first, String second, int value) {
    }
}

class Target {
    void testMe() {
        new Mocked("Hello", "World", 99);
    }
}


@Test
public void test_Target() {
    try (
        MockedConstruction<Mocked> mockedNew = mockConstruction(Mocked.class);
    ) {
        new Target().testMe();

        Mocked mocked = mockedNew.constructed().get(0);
        // TODO: verify all arguments passed to mocked
    }
}
  • 我要测试的课程是“Target”
  • Target 使用“Mocked”类的实例。在真实的代码中,我想使用 Mocked 的实际实例,但为了测试的目的,我想模拟它,这样我就可以单独测试“Target”和“Mocked”。我使用了 mockConstruction 构造来执行此操作。

在我的代码的最终版本中,传递给模拟构造函数的参数没有被硬编码。相反,会有一些业务逻辑来派生它们,因此我想验证它们是否已正确派生。但如何呢?

我在 Google 上搜索到的示例都没有告诉我如何执行此操作,并且

org.mockito.Mockito.verify()
似乎没有办法测试构造函数。

我能看到的唯一解决方案是添加模拟初始化函数,将参数复制到局部变量中。但这涉及到使这些变量有效地成为最终变量(因此最终一个元素数组)和丑陋的强制转换。肯定有比这更好的东西!

我错过了什么?

java unit-testing mocking mockito
2个回答
0
投票

据我所知,使用 Mockito API 是不可能的。

您可以尝试进行设计更改,其中新的

MockedFactory
类负责创建
Mocked
对象。您可以为您的测试创建一个
MockMockedFactory
并将其注入到 Target 中以供使用。您将能够验证被测类对此工厂调用的方法。不是最好的,添加了样板代码,但可以工作。

另外,我猜新创建的对象不会返回,因为那时测试就不会成为问题。值得考虑的是,您正在测试的方法是否太大,不能同时执行太多操作。也许其他一些重构可以帮助使其更具可测试性。

或者也许是这个:https://groups.google.com/g/mockito/c/WqPlcNrvbOw?pli=1


0
投票

您可以使用 Junit 或您选择的测试库对传递到 mockedConstructor 的

context
参数运行断言,该参数将具有传递到构造函数的参数列表。 (请注意,它们都将存储为
Object
,因此您需要投射它们)例如

try (MockedConstruction<Mocked> mockedConstructor = mockConstruction(Mocked.class, (mock, context) -> {
             assertEquals("Hello", (String) context.arguments().get(0));
             assertEquals("World", (String) context.arguments().get(1));
             assertEquals(99, (int) context.arguments().get(2));
    }))
{
    new Target().testMe();
}
© www.soinside.com 2019 - 2024. All rights reserved.