我正在使用Junit 4和Mockito,我希望对方法调用进行存根,以便抛出异常:
doThrow(MyException.class).when(myObject).foo();
问题是,MyException是一个已检查的异常,因此在此语句中调用foo()
会导致编译器抱怨我必须处理异常或向我的方法添加throws子句。
所以我想知道处理这种情况的正确方法是什么?到目前为止,我的想法是:
throws MyException
添加到测试方法e.g。
private void givenFooThrowsAnException(MyObject myObject) {
try {
doThrow(MyException.class).when(myObject).foo();
} catch (MyException e) {
// Required to stub a checked exception
}
}
答案 0 :(得分:2)
虽然存根强制您处理已检查的异常,但它实际上永远不会抛出该异常。最优雅的方法是声明测试方法以抛出该异常。
这种做法只有一点需要注意。如果您的测试实际上通过在@Test
注释中声明它来验证是否抛出了已检查的异常。
@Test(expected=MyException.class)
public void test...() throws MyException {
//...
}
在这种情况下,如果您的存根被搞砸并且确实抛出了已检查的异常,则可能会产生可能应该失败的传递测试。
或者你可以简单地use unchecked exceptions。