Mockito:了解when()。thenThrow()函数的工作原理

时间:2017-11-06 01:02:52

标签: java junit mockito

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

当存在冲突的语句以从模拟对象中具有相同参数列表的方法返回值时,我观察到最近将返回/ 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);
}

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

2 个答案:

答案 0 :(得分:2)

第一个示例是按照设计,您可以参考以下链接了解更多详情。

https://static.javadoc.io/org.mockito/mockito-core/2.11.0/org/mockito/Mockito.html#stubbing_consecutive_calls

在第二个示例中,尝试再次注册存根when(mockObj.method(param1,param2)).thenThrow(ExceptionTwo.class);时引发了异常。请注意,这不是由于声明mockObj.method(param1, param2);

在我看来,执行第二个when.thenThrow语句时可能会有实际的方法调用。如果您希望后续调用具有不同的异常,则可以合并为一个语句when(mockObj.method(param1, param2)).thenThrow(ExceptionOne.class, ExceptionTwo.class);

答案 1 :(得分:2)

在第一种情况下,正如文件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时,将调用stubbed方法。第一次没有观察它,因为它是在模拟对象上调用的。但是当你第二次写when时,我们会对mock.foo()有一些行为(你之前设置它会抛出异常)。因此,第二个when(..)语句在您的情况下抛出异常。所以你应该使用doThrow()。when(..)。method(...)而不是。