我只是通过简化来重构代码的许多部分。现在我还需要重构测试,使它们再次变绿,这并不难。
但现在我有点挣扎,因为我看到我不再需要一些.when()声明了,因为这些Mock将不再被调用。问题是它们不会让我的测试变红,所以我只能通过仔细检查每个测试并将其与代码进行比较来识别它们,这有点烦人,并导致它变成这样。
有没有可能使when()抛出错误之类的内容不被使用?就像一次从未发生过的验证?像在setUp:Mockito.enableDebugMode()或其他什么程序中那样做就足够了,也许有这样的可能性。。
最佳
此功能已添加到Mockito 2.1.0中(https://github.com/mockito/mockito/issues/384)。
默认的JUnit规则配置是在控制台中记录警告:
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
但你甚至可以通过增加严格性来让你的测试失败:
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
选项1您可以一次从测试中删除对when()
的调用(如@poomandr所建议的),直到调用失败。失败的测试意味着您必须将对when()的调用添加回测试中。
选项2尽管您也可以通过为每次对when()
的调用添加verify()
断言来解决这个问题(如@HansiKrankl所建议的),但这意味着要在测试用例中添加更多的代码(fluff)。
选项3作为另一种选择,你可以使用像Emma这样的代码覆盖工具,你可以从IDE中运行它。然后是运行测试,然后查看是否在测试中的类中进行了调用。
选项4关于尝试计数调用次数,还有其他建议。
就我个人而言,我会选择选项1并开始逐一清理测试。通过逐一查看测试,您将更好地了解测试,这是一个清理测试的机会,使它们更易于维护。
也许您可以为每个when()调用添加一个verify()调用。那么,在未执行调用时会引发异常吗?
如果问题有自动解决方案,请留下回复。
嗯,如何使用Mockito.verifyNoMoreInteractions(YOUR_MOCKS)?如果某个mock对象配置了Mockito.when(),但没有在该mock上调用相应的Mockito.verify()方法,它将抛出异常。当然可能会导致误报,但总比什么都没有好。
在JUnit 5中,如果用注释测试类,未使用/不匹配的mocking将导致测试失败
@ExtendWith(MockitoExtension.class)
这来自于mockito-junit-jupiter
依赖关系。您可以在GitHub上查看源代码:MockitoExtension.java