我正在使用Junit 4和Mockito,我想存根一个方法调用,以便它抛出一个异常:
doThrow(MyException.class).when(myObject).foo();
问题是,MyException是一个检查异常,所以在这个语句中调用foo()
会导致编译器抱怨我必须处理异常或在我的方法中添加一个抛出子句。
所以我想知道处理这种情况的正确方法是什么?到目前为止,我的想法是:
- 我用错了,有更好的方法。
- 我只是将
throws MyException
添加到测试方法 - 我将调用提取到另一个方法,该方法只是吞下异常
。
private void givenFooThrowsAnException(MyObject myObject) {
try {
doThrow(MyException.class).when(myObject).foo();
} catch (MyException e) {
// Required to stub a checked exception
}
}
虽然存根强制您处理检查异常,但它实际上永远不会抛出该异常。最优雅的方法是声明test方法来抛出该异常。
对于这种方法只有一个警告。如果您的测试实际上验证了检查异常是通过在@Test
注释中声明抛出的。
@Test(expected=MyException.class)
public void test...() throws MyException {
//...
}
在这种情况下,如果存根处理混乱并抛出检查异常,则可能产生一个通过的测试,而该测试可能应该失败。