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

时间:2014-08-29 08:09:00

标签: java testing junit mockito

我只是通过简化事情来重构代码的很多部分。 现在我需要重构测试以使它们再次变绿,这并不难。

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

是否有可能使未使用的.when()抛出错误等等?就像从未发生的验证一样?这就像在setUp:Mockito.enableDebugMode()或其他任何事情那样做,也许有这样的可能性? ..

最佳

4 个答案:

答案 0 :(得分:4)

此功能已添加到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 :(得分:3)

选项1 您可以一次从测试中删除对when()的调用(如@ponomandr所建议的那样),直到它们失败。失败的测试意味着您将对when()的调用添加回测试,因为它必须是必需的。

选项2 虽然您也可以通过为verify()的每次调用添加when()断言来解决此问题(正如@HansiKrankl所建议的那样),但这意味着在测试用例中添加更多代码(fluff)。

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

选项4 关于尝试count the number of invocations还有其他建议。

我个人会选择选项1 并开始逐个清理测试。您将更好地了解逐个查看它们的测试,这是一个清理它们以便更易于维护的机会。

答案 2 :(得分:0)

也许你可以为每个when()调用添加一个verify()调用。因此,当未执行调用时会抛出异常吗?

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

答案 3 :(得分:0)

嗯,即将使用Mockito.verifyNoMoreInteractions(YOUR_MOCKS)的内容是什么? 如果某个模拟对象配置了Mockito.when()但是在此模拟上没有调用相应的Mockito.verify()方法,它将抛出异常。 当然可能导致误报,但更好的是没有。