1

我最近在研究 的源代码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);
}
4

3 回答 3

2

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

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

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

Protectable接口的存在是为了给 runner 提供一个更通用的接口,这样您就不必将 aTestCase交给方法,以允许不同的操作。

顺便说一句,这是 package 的一部分junit.framework.*,它是 JUnit 3。JUnit 4 就是它所在的地方,如果你想学习,请在org.junit.*包中查看更多内容。

于 2013-02-23T16:27:14.773 回答
0

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

于 2013-02-22T15:10:00.003 回答
0

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

The Throwable class is the superclass of all errors and exceptions in the Java language.
于 2018-06-05T02:32:35.277 回答