【问题标题】:Stubbing a checked exception: how to handle the exception存根检查的异常:如何处理异常
【发布时间】:2013-02-18 12:03:08
【问题描述】:

我正在使用 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
    }
}

【问题讨论】:

  • 检查 foo() 方法的签名,它应该抛出一个检查异常吗?如果不是,您使用错误。在你的测试中抛出一个 runtimeException。
  • 我会选择选项 #2。在测试方法中添加 throws Exception 没有错吗?
  • myObject 是我注入到被测类的依赖项。我正在测试被测类采用的两条路径,其中一条发生在 myObject.foo() 抛出 MyException 时,这是一个已检查的异常。也许我误解了你的观点,但我的问题不在于我说的是 doThrow(MyException.class),而是编译器在这里看到了对 foo() 的调用,这引发了必须处理的异常。但由于这只是设置一个存根,因此实际上不会抛出异常。
  • 因此,如果抛出异常,则说明出现严重错误,您希望测试失败。所以在你的测试方法签名中添加throws MyException子句,如果抛出异常,让JUnit让测试失败。

标签: java junit junit4 mockito stub


【解决方案1】:

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

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

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

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

您也可以简单地use unchecked exceptions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多