gpt4 book ai didi

java - Mockito:了解when().thenThrow()函数如何工作

转载 作者:行者123 更新时间:2023-12-01 17:53:53 25 4
gpt4 key购买 nike

when(mockObj.method(param1, param2)).thenReturn(1);
when(mockObj.method(param1, param2)).thenReturn(2);

当存在冲突的语句从模拟对象中具有相同参数列表的方法返回值时,我观察到将返回最近的when/thenReturn。因此,下面的陈述是正确的。

assertEquals(2, mockObj.method(param1, param2));

当有冲突的语句抛出异常时,行为与上面不同。例如,

@Test(expected = ExceptionTwo.class)
public void testMethod() {
when(mockObj.method(param1, param2)).thenThrow(ExceptionOne.class);
when(mockObj.method(param1, param2)).thenThrow(ExceptionTwo.class);
mockObj.method(param1, param2);
}

此测试用例失败。任何解释都会有帮助。

最佳答案

在第一种情况下,正如文档提到的 here :

Warning : if instead of chaining .thenReturn() calls, 
multiple stubbing with the same matchers or arguments is used,
then each stubbing will override the previous one.

因此第二个将覆盖第一个。因此,返回 2。其他情况可以引用here :

when(mock.foo()).thenThrow(new RuntimeException());

//Impossible: the exception-stubbed foo() method is called so RuntimeException is thrown.
when(mock.foo()).thenReturn("bar");

//You have to use doReturn() for stubbing:
doReturn("bar").when(mock).foo();

当您使用when..thenReturn时,将调用 stub 方法。第一次您没有观察到它,因为它是在模拟对象上调用的。但是,当您第二次编写 when 时,我们就会对 mock.foo() 有一些行为(您之前将其设置为抛出异常)。因此,第二个 when(..) 语句在您的情况下引发异常。所以你应该使用 doThrow().when(..).method(...) 代替。

关于java - Mockito:了解when().thenThrow()函数如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47128320/

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