【问题标题】:How to tell JUnit to ignore nested exceptions?如何告诉 JUnit 忽略嵌套异常?
【发布时间】:2014-07-08 10:59:00
【问题描述】:

如果我有 2 个这样的课程:

public class A {

    public A(boolean bool){
        if(bool){
            // currently broken
            // would throw RuntimeException
        }
        B.doSomething();
    }
}

public class B {

    public static void doSomething() throws RuntimeException{
        throw new RuntimeException();
    }
}

我对@9​​87654323@ 类的单元测试将是:

public class ATest {
    @Test (expected=RuntimeException)
    public void testA(){
        new A(true);
    }
}

事实上,由于B 类方法也抛出了RuntimeException 并且A 被破坏的事实不会立即可见,因此测试会成功。

是否可以告诉 JUnit 在不使用模拟框架的情况下以某种方式忽略来自 B 的异常?

【问题讨论】:

  • 简短回答:不。解释:只有 A 应该是被测单元。 B 是一个依赖项
  • 我的猜测:在您的测试中使用 try catch 块可以帮助您,但它会破坏测试(恕我直言)。
  • 进行分别测试 AB 的测试。

标签: java unit-testing exception junit4


【解决方案1】:

否 - 调用该方法的结果是 RuntimeException,这就是您要测试的内容。 JUnit 如何区分 RuntimeException 与您正在调用的确切方法和依赖调用之间的区别?测试的规则之一是,您不必关心如何获得结果的细节,只关心它获得的。 (例如,您可以将 A 构造函数中的块中的代码移动到单独的方法中,这不应该破坏测试。)

目前,您只需检查调用new A(false) 不会 抛出异常,就可以轻松地让测试失败。目前该测试将失败,因为您仍在调用B.doSomething(),它仍然会抛出。

请注意,大多数模拟框架也无济于事,因为您使用的是静态方法 - 您至少应该考虑使 B 成为注入依赖项(可能带有接口),以便进行更多控制。

【讨论】:

    【解决方案2】:

    无论如何,您通常应该远离“原始”异常类,因此解决此问题的正确方法是创建一个 RuntimeException 的子类,以反映实际出了什么问题。

    这样你就可以在你的测试用例中引用RuntimeException的正确子类,你应该没问题。

    【讨论】:

      【解决方案3】:

      如果您没有要捕获的特定 RuntimeExceptionRuntimeException 的子类),那么我看到的唯一方法是将 try catch 放入您的 testA 方法和 catch 中,验证如果异常不包含嵌套异常,则重新抛出异常或调用Assert.fail()

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 2022-06-29
        • 2011-12-17
        • 2018-03-06
        • 2014-03-11
        相关资源
        最近更新 更多