我正在尝试弄清楚如何验证传递给 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
}
}
在我的代码的最终版本中,传递给模拟构造函数的参数没有被硬编码。相反,会有一些业务逻辑来派生它们,因此我想验证它们是否已正确派生。但如何呢?
我在 Google 上搜索到的示例都没有告诉我如何执行此操作,并且
org.mockito.Mockito.verify()
似乎没有办法测试构造函数。
我能看到的唯一解决方案是添加模拟初始化函数,将参数复制到局部变量中。但这涉及到使这些变量有效地成为最终变量(因此最终一个元素数组)和丑陋的强制转换。肯定有比这更好的东西!
我错过了什么?
据我所知,使用 Mockito API 是不可能的。
您可以尝试进行设计更改,其中新的
MockedFactory
类负责创建 Mocked
对象。您可以为您的测试创建一个 MockMockedFactory
并将其注入到 Target 中以供使用。您将能够验证被测类对此工厂调用的方法。不是最好的,添加了样板代码,但可以工作。
另外,我猜新创建的对象不会返回,因为那时测试就不会成为问题。值得考虑的是,您正在测试的方法是否太大,不能同时执行太多操作。也许其他一些重构可以帮助使其更具可测试性。
或者也许是这个:https://groups.google.com/g/mockito/c/WqPlcNrvbOw?pli=1
您可以使用 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();
}