java Mockito,doNothing()在()时的用法
我是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();
,测试是否仍然有效,并且将测试我们想要测试的内容,以使该方法在第二次抛出异常
# 1 楼答案
doNothing
方法不会更改mocked' method, but the declaration of the
doThrow的行为does. If you have a spy and don't want a method to be executed, then
任何`都不会更改行为# 2 楼答案
为便于参考,对以下几点进行编号:
mock的默认行为是每次返回一个适当的伪值,通常为零、
null
或空字符串。间谍的默认行为是调用间谍的实际实现。当然,通过@Mock
或Mockito.mock
的参数,您可以使用任意答案或Mockito的standard或additional答案中的任何一个当多个动作作为一个链的一部分给出时,Mockito将按顺序执行每个动作,并永远重复最后的动作
注意,这是在同一个链中;最新定义的匹配链获胜,因此单独的语句不会产生相同的效果
doNothing
然后,从覆盖默认行为或在链中设置动作中获取其大部分值因此,测试试图做的是第一次
doNothing
验证将成功,然后第二次doThrow
满足预期的异常。虽然失败的verify
会(正确地)因为Mockito's errors subclass Error and not Exception而使测试失败,但是删除doNothing
仍然会在第一次调用a.usesVoidMethod()
时引发异常,从而使测试通过,这是正确的。尽管这对于测试来说已经足够好了,但您可以在测试本身中看到doNothing
。更健壮的测试可能如下所示: