JUnit源代码中Proctectable接口的含义是什么?

时间:2013-02-22 12:24:23

标签: junit junit4

我最近正在深入研究JUnit-4.11的源代码,让我感到困惑的是看似冗余的Protectable接口。声明如下:

public interface Protectable {
    public abstract void protect() throws Throwable;
}

TestResult类中,有一个void run(final TestCase test)方法,其中实现了匿名Protectable实例,如下所示:

protected void run(final TestCase test) {
    startTest(test);
    Protectable p = new Protectable() {
        public void protect() throws Throwable {
           test.runBare();
        }
    };
    runProtected(test, p);

    endTest(test);
}

runProtected方法如下:

public void runProtected(final Test test, Protectable p) {
    try {
        p.protect();
    } catch (AssertionFailedError e) {
       addFailure(test, e);
    } catch (ThreadDeath e) { // don't catch ThreadDeath by accident
        throw e;
    } catch (Throwable e) {
        addError(test, e);
    }
}

正如我们所看到的,runProtected只是执行test.runBare();,所以对Protectable接口的存在有什么意义吗?为什么我们不能只编写如下代码。

protected void run(final TestCase test) {
    startTest(test);
    test.runBare();
    endTest(test);
}

3 个答案:

答案 0 :(得分:2)

首先回答你的最后一个问题,你不能使用

protected void run(final TestCase test) {
    startTest(test);
    test.runBare();
    endTest(test);
}

因为它不会做你想要的。 JUnit使用异常管理断言,特别是AssertionFailedError。因此,Assert.assertEquals()在两个值不相等时抛出AssertionFailedError。因此,在上面的方法中,如果存在断言失败,则不会调用endTest(test),这意味着不会触发正确的事件(测试的失败/错误),tearDown()不会被执行。

Protectable接口用于为跑步者提供更通用的界面,因此您不必将TestCase交给该方法,以允许不同的操作。

顺便说一句,这是包junit.framework.*的一部分,它是JUnit 3. JUnit 4就在它的位置,如果你想学习,请查看org.junit.*包中的更多信息。 / p>

答案 1 :(得分:0)

它似乎以特定的方式处理抛出的异常: 调用addFailure进行断言异常(测试失败),addError调用其他异常(测试编码不正确)

答案 2 :(得分:0)

此接口用于通过添加Throwable来保护TestCase。 所以junit可以安全地运行任何测试用例。

The Throwable class is the superclass of all errors and exceptions in the Java language.