Java Mockito,doNothing()在()时的用法
我是Mockito的新手,我复习了这个示例,但有一个步骤我不明白,它在方法的第一行调用Java Mockito,doNothing()在()时的用法,java,unit-testing,mockito,Java,Unit Testing,Mockito,我是Mockito的新手,我复习了这个示例,但有一个步骤我不明白,它在方法的第一行调用doNothing(): @Test(expected = RuntimeException.class) public void testConsecutiveCalls() throws Exception(){ doNothing().doThrow(Exception.class).when(b).voidMethod(); a.usesVoidMethod() verify(b).void
doNothing()
:
@Test(expected = RuntimeException.class)
public void testConsecutiveCalls() throws Exception(){
doNothing().doThrow(Exception.class).when(b).voidMethod();
a.usesVoidMethod()
verify(b).voidMethod();
a.usesVoidMethod()
}
我确实理解,当第一次调用voidMethod()
时,它什么也不返回,而在第二次调用时,它给出了一个异常
但是如果我们删除
doNothing.doThrow(Exception.class).when(b.voidMethod()代码>,测试是否仍然有效,并且将测试我们想要测试的内容,以使该方法在第二次抛出异常 doothing
方法不会改变mocked'方法的行为,但是doThrow的声明会改变。如果您有间谍并且不希望执行某个方法,则
doNothing`将不会改变行为。为便于参考而编号的几点:
模拟的默认行为是每次返回一个适当的伪值,通常为零、null
或空字符串。间谍的默认行为是调用间谍的实际实现。当然,通过@Mock
或Mockito.Mock
的参数,您可以使用任意答案或任何Mockito或答案
当多个动作作为一个链的一部分给出时,Mockito将按顺序执行每个动作,并永远重复最后的动作
// calls to foo.bar() return 1, 2, 3, 3, 3...
doReturn(1).thenReturn(2, 3).when(foo).bar();
注意,这是在同一个链中;最新定义的匹配链获胜,因此单独的语句不会产生相同的效果
doReturn(1).thenReturn(2).when(foo).baz();
doReturn(3).thenReturn(4).when(foo).baz();
// calls return 3, 4, 4, 4... because the first chain is entirely overridden.
doNothing
,则从覆盖默认行为或在链中设置操作中获取其大部分价值
因此,测试试图做的是第一次doNothing
,这样验证就会成功,然后第二次doThrow
,以满足预期的异常。尽管失败的verify
会(正确地)使测试失败,因为您可以确定,删除doNothing
仍然会在第一次调用a时引发异常,从而导致测试通过。usesVoidMethod()
。尽管这对于测试来说已经足够好了——毕竟,您可以在测试本身中看到doNothing
——但更健壮的测试可能如下所示:
@Test
public void testConsecutiveCalls() throws Exception(){
doNothing().doThrow(SomeKnownException.class).when(b).voidMethod();
a.usesVoidMethod();
verify(b).voidMethod();
try {
a.usesVoidMethod();
fail();
} catch (SomeKnownException expected) { /* OK */ }
}
那么doThrow(Exception.class)
是如何改变它的呢?如果我删除doNothing().doThrow(Exception.class).when(b).voidMethod()代码>这样做的副作用是什么?