gpt4 book ai didi

java - Mockito,doNothing() When() 的用法

转载 作者:行者123 更新时间:2023-11-29 07:32:46 29 4
gpt4 key购买 nike

我是 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. mock 的默认行为是每次都返回一个适当的虚拟值,通常为零、null 或空字符串。 spy 的默认行为是调用 spy 的真实实现。当然,通过参数给@Mock或者Mockito.mock,你可以使用任意的Answer或者Mockito的standard中的任意一个。或 additional答案。

  2. 当多个 Action 作为链的一部分给出时,Mockito 将按顺序执行每个 Action 并永远重复最后一个 Action 。

    // 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.
  3. 然后,
  4. doNothing覆盖默认行为在链中设置一个操作 获取其大部分值(value)。

所以测试尝试做的是第一次doNothing这样验证就会成功,然后doThrow第二次时间来满足预期的异常。尽管失败的 verify 会(正确地)使测试失败,因为 Mockito's errors subclass Error and not 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 */ }
}

关于java - Mockito,doNothing() When() 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39822532/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com