如何告诉JUnit忽略嵌套异常?

时间:2014-07-08 10:59:01

标签: java unit-testing exception junit4

如果我有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();
    }
}

我对班级A的单元测试将遵循:

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

实际上,测试会因为B类方法同时抛出RuntimeException而成功,并且A被破坏的事实不会立即显现。

是否有可能告诉JUnit以某种方式忽略来自B的异常而不使用模拟框架?

3 个答案:

答案 0 :(得分:1)

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

目前,只需检查调用new A(false) 没有抛出异常,您就可以轻松完成失败的测试。目前该测试将失败,因为您仍然会调用B.doSomething(),但仍会抛出。{/ p>

请注意,大多数模拟框架都不会对此有所帮助,因为您正在使用静态方法 - 您至少应该考虑使B成为注入依赖项(可能带有接口),以便进行更多控制

答案 1 :(得分:0)

你通常应该远离原始的'无论如何,异常类,所以解决这个问题的正确方法是创建一个RuntimeException的子类,它反映了实际出错的地方。

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

答案 2 :(得分:0)

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