Java Mockito:如何在测试中识别未使用的.when()

Java Mockito:如何在测试中识别未使用的.when(),java,testing,junit,mockito,Java,Testing,Junit,Mockito,我只是通过简化一些东西来重构代码的许多部分。 现在我还需要重构测试,使它们再次变成绿色,这并不难 但现在我有点挣扎,因为我看到我不再需要一些.when()声明,因为这些mock将不再被调用。问题是它们不会使我的测试变红,所以我只能通过仔细检查每个测试并将其与代码进行比较来识别它们,这有点烦人,并导致这样的结果 是否有可能使未使用。当()抛出错误或类似错误时?就像一个从未发生过的验证?在安装程序中这样做就足够了:Mockito.enableDebugMode()或其他什么,也许有这种可能性 最好的

我只是通过简化一些东西来重构代码的许多部分。 现在我还需要重构测试,使它们再次变成绿色,这并不难

但现在我有点挣扎,因为我看到我不再需要一些.when()声明,因为这些mock将不再被调用。问题是它们不会使我的测试变红,所以我只能通过仔细检查每个测试并将其与代码进行比较来识别它们,这有点烦人,并导致这样的结果

是否有可能使未使用。当()抛出错误或类似错误时?就像一个从未发生过的验证?在安装程序中这样做就足够了:Mockito.enableDebugMode()或其他什么,也许有这种可能性

最好的

也许您可以为每个when()调用添加一个verify()调用。那么当调用未执行时会引发异常

如果问题有自动解决方案,请留下答复。

选项1 您可以从测试中一次删除对
when()
的调用(如@ponomandr所建议的),直到调用失败为止。失败的测试意味着您必须将对when()的调用重新添加到测试中

选项2 尽管您也可以通过为每次调用
when()
(如@HansiKrankl所建议的)添加
verify()
断言来解决这个问题,但这意味着向测试用例添加更多的代码(fluff)

选项3 作为另一种选择,您可以使用代码覆盖率工具,如whichi,从IDE运行。然后是运行测试,然后查看是否在被测试的类中进行了调用

选项4 还有其他一些建议可以帮助你解决这个问题


就我个人而言,我会选择选项1,并开始逐一清理测试。您将对逐个查看的测试有更好的了解,这是一个清理测试的机会,因此它们更易于维护。

Hmm,将如何使用Mockito.verifyNoMoreInteractions(您的模拟)? 如果某个模拟对象配置了Mockito.when(),但没有在此模拟上调用相应的Mockito.verify()方法,它将引发异常。
当然,这可能会导致误报,但总比什么都没有好

此功能已添加到Mockito 2.1.0()

默认的JUnit规则配置是在控制台中记录警告:

@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
但你甚至可以通过增加严格程度使你的测试失败:

@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);

尝试简单地删除when()并运行测试。如果它变为红色,这显然是必需的。如果你重新分解了你的代码,破坏了你的测试,那么你就做了坏事。重新分解后,您的测试应保持绿色。如果你考虑到更小的步骤,那么你可以一次处理一个测试用例,并且不会发现你自己在这个黑暗的地方。此外,您的测试应该小且易于理解,否则您的被测类会做得太多。我发现选项1可以很好地工作,特别是当您可以使用测试替代小重构以减少噪音时。或者使用
public MockitoRule MockitoRule=MockitoJUnit.rule().strigness(strigness.LENIENT)消除提示;[不推荐]有时候去掉提示是好的。我有一个测试,其中失败条件的一部分是调用when().thenAnswer()条件。没有它,我就不会知道事情会变糟。当测试通过时,When().thenAnswer()不会被调用,我会得到Mockito消息(看起来像是单元测试失败)。