3

我正在使用 Junit 4 和 Mockito,我想存根一个方法调用,以便它引发异常:

doThrow(MyException.class).when(myObject).foo();

问题是,MyException 是一个已检查的异常,因此foo()在此语句中的调用会导致编译器抱怨我必须处理异常或在我的方法中添加 throws 子句。

所以我想知道处理这种情况的正确方法是什么?到目前为止,我的想法是:

  1. 我用错了,有更好的方法来做到这一点。
  2. 我只是添加throws MyException到测试方法
  3. 我将调用提取到另一个方法,该方法只是吞下异常

例如

private void givenFooThrowsAnException(MyObject myObject) {
    try {
        doThrow(MyException.class).when(myObject).foo();
    } catch (MyException e) {
        // Required to stub a checked exception
    }
}
4

1 回答 1

2

虽然存根强制您处理已检查的异常,但它实际上永远不会抛出该异常。最优雅的方法是声明测试方法以抛出该异常。

这种方法只有一个警告。@Test如果您的测试实际上通过在注释中声明检查的异常来验证它是否被抛出。

@Test(expected=MyException.class)
public void test...() throws MyException {
    //...
}

在这种情况下,如果你的存根搞砸了并且确实抛出了检查的异常,它可能会产生一个可能应该失败的通过测试。

或者,您可以简单地使用未经检查的异常

于 2013-03-04T19:35:07.210 回答