【发布时间】:2013-02-18 12:03:08
【问题描述】:
我正在使用 Junit 4 和 Mockito,我想存根一个方法调用,以便它引发异常:
doThrow(MyException.class).when(myObject).foo();
问题是,MyException 是一个已检查的异常,因此在此语句中调用 foo() 会导致编译器抱怨我必须处理异常或在我的方法中添加 throws 子句。
所以我想知道处理这种情况的正确方法是什么?到目前为止,我的想法是:
- 我用错了,有更好的方法。
- 我只是在测试方法中添加
throws MyException - 我将调用提取到另一个方法,该方法只是吞下异常
例如
private void givenFooThrowsAnException(MyObject myObject) {
try {
doThrow(MyException.class).when(myObject).foo();
} catch (MyException e) {
// Required to stub a checked exception
}
}
【问题讨论】:
-
检查 foo() 方法的签名,它应该抛出一个检查异常吗?如果不是,您使用错误。在你的测试中抛出一个 runtimeException。
-
我会选择选项 #2。在测试方法中添加 throws Exception 没有错吗?
-
myObject 是我注入到被测类的依赖项。我正在测试被测类采用的两条路径,其中一条发生在 myObject.foo() 抛出 MyException 时,这是一个已检查的异常。也许我误解了你的观点,但我的问题不在于我说的是 doThrow(MyException.class),而是编译器在这里看到了对 foo() 的调用,这引发了必须处理的异常。但由于这只是设置一个存根,因此实际上不会抛出异常。
-
因此,如果抛出异常,则说明出现严重错误,您希望测试失败。所以在你的测试方法签名中添加
throws MyException子句,如果抛出异常,让JUnit让测试失败。
标签: java junit junit4 mockito stub