对已检查的异常进行存根:如何处理异常

时间:2013-03-04 11:51:07

标签: java junit junit4 mockito stub

我正在使用Junit 4和Mockito,我希望对方法调用进行存根,以便抛出异常:

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

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

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

  1. 我使用它错了,有更好的方法。
  2. 我只是将throws MyException添加到测试方法
  3. 我将调用解压缩到另一个只吞下异常的方法
  4. e.g。

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

1 个答案:

答案 0 :(得分:2)

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

这种做法只有一点需要注意。如果您的测试实际上通过在@Test注释中声明它来验证是否抛出了已检查的异常。

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

在这种情况下,如果您的存根被搞砸并且确实抛出了已检查的异常,则可能会产生可能应该失败的传递测试。

或者你可以简单地use unchecked exceptions