Mockito,doNothing() When() 的用法

新手上路,请多包涵

我是 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 许可协议

阅读 2.6k
1 个回答

几点,编号只是为了方便参考:

  1. 模拟 的默认行为是每次都返回一个适当的虚拟值,通常为零 null 或一个空字符串。间谍的默认行为是调用间谍的真实实现。当然,通过参数 @MockMockito.mock ,您可以使用任意答案或任何 Mockito 的 标准附加 答案。

  2. 当多个动作作为链的一部分给出时,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.

  1. doNothing 然后,它的大部分价值来自 覆盖默认行为 或 _在链中设置一个动作_。

所以测试 试图 做的是 doNothing 第一次验证成功,然后 doThrow 第二次满足预期的异常。虽然失败的 verify 会(正确地)失败测试,因为 Mockito 的错误子类 Error 而不是 Exception ,你是对的,删除 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 */ }
}

原文由 Jeff Bowman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏