Java Mockito,doNothing()在()时的用法

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

我是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()
}
我确实理解,当第一次调用
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()这样做的副作用是什么?