我最近正在深入研究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);
}
答案 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.