我正在尝试解决如何在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的一个实际示例,但出于测试的目的,我希望模拟它,这样我就可以在隔离"Mocked"的情况下测试"Target"。我使用了mockConstruction构造来完成此操作。
在我的代码的最终版本中,传递给Mocked构造函数的参数不是硬编码的,相反,会有一些业务逻辑来派生它们,所以,我想验证它们是否被正确地派生出来,但是怎么做呢?
我在Google上搜索过的示例中没有一个向我展示如何做到这一点,而且org.mockito.Mockito.verify()
似乎没有测试构造函数的方法。
我能看到的唯一解决方案是添加mock初始化器函数,将参数复制到局部变量中。但这涉及到使这些变量有效地成为final(final one element数组)和丑陋的强制转换。肯定有比这更好的方法!
我错过了什么?
1条答案
按热度按时间wfveoks01#
据我所知,这是不可能使用Mockito API。
您可以尝试进行设计更改,其中新的
MockedFactory
类负责创建Mocked
对象。您可以为测试创建MockMockedFactory
,并将其注入Target中以供使用。您将能够验证被测类对此工厂调用的方法。这不是最好的方法,添加了样板代码,但可以工作。另外,我猜新创建的对象不会返回,因为测试不会成为问题。如果你正在测试的方法不是太大,一次做太多的事情,这是值得考虑的。也许其他一些重构可以帮助使它更容易测试。
或者这个:https://groups.google.com/g/mockito/c/WqPlcNrvbOw?pli=1