我是 Mockito 的新手,我查看了这个示例,但是当它在方法的第一行调用 doNothing()
时,有一个步骤我不明白:
@Test(expected = RuntimeException.class)
public void testConsecutiveCalls() throws Exception(){
doNothing().doThrow(Exception.class).when(b).voidMethod();
a.usesVoidMethod()
verify(b).voidMethod();
a.usesVoidMethod()
}
我确实明白,当第一次调用 voidMehtod()
时什么都不返回,第二次它给出异常。
但是,如果我们删除 doNothing.doThrow(Exception.class).when(b).voidMethod();
,测试是否仍然有效并且将测试我们想要测试的方法第二次抛出异常?
原文由 MIKE 发布,翻译遵循 CC BY-SA 4.0 许可协议
几点,编号只是为了方便参考:
模拟 的默认行为是每次都返回一个适当的虚拟值,通常为零
null
或一个空字符串。间谍的默认行为是调用间谍的真实实现。当然,通过参数@Mock
或Mockito.mock
,您可以使用任意答案或任何 Mockito 的 标准 或 附加 答案。当多个动作作为链的一部分给出时,Mockito 将按顺序执行每个动作并永远重复最后一个动作。
请注意,这是在同一链中;最近定义的匹配链获胜,因此单独的语句不会产生相同的效果。
doNothing
然后,它的大部分价值来自 覆盖默认行为 或 _在链中设置一个动作_。所以测试 试图 做的是
doNothing
第一次验证成功,然后doThrow
第二次满足预期的异常。虽然失败的verify
会(正确地)失败测试,因为 Mockito 的错误子类 Error 而不是 Exception ,你是对的,删除doNothing
仍然会导致测试通过在第一次调用a.usesVoidMethod()
时抛出异常。尽管这对于测试来说已经足够好了——毕竟,您可以在测试本身中看到doNothing
更稳健的测试可能如下所示: