java - stub 检查异常 : how to handle the exception

标签 java junit junit4 mockito stub

我正在使用 Junit 4 和 Mockito,我想 stub 一个方法调用,以便它抛出异常:

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
    }
}

最佳答案

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

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

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

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

或者你可以简单地 use unchecked exceptions .

关于java - stub 检查异常 : how to handle the exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15200898/

相关文章:

Android JUnit 测试未在 Robotium 中检测到

java - JUnit 和 Maven 构建在 Eclipse 中失败,并显示 java.lang.NoSuchFieldError : address?

java - 在 Firefox 中自动下载 pdf 文件

java - 在循环中将 TreeMap 添加到 ArrayList

java - 使用 hibernate @Entity 注释重命名或移动类是否安全?

java - 如何在使用 ANT 运行类或套件中的所有测试时打印当前正在执行的 JUnit 测试方法?

java - 使用静态枚举类模拟类时出现 "Failed to transform class with name"错误

java - 避免 Word 在 Apache POI 生成的 .doc 开头显示空白页

JavaFX 在两台显示器上全屏显示应用程序

junit - 如何在 Jenkins 中使用 Email-ext 获取 Junit 测试结果