[英]Why do multiple JUnit TestWatchers not spawn multiple test method calls?
我在测试套件中的每个测试上都使用了多个JUnit TestWatchers。 我担心每个TestWatcher都在调用base.evaluate()
而每个测试实际上却运行了多次(每次对base.evaluate()
调用一次)。 这似乎没有发生, 这很好 ,但是我对为何如此感到困惑。
为什么一个测试中没有多个JUnit TestWatchers导致对测试方法的多次调用?
我认为我对这些组件(尤其是base.evaluate()
)如何相互作用有一些根本的误解,但还没有找到任何好的方法来解决我的这种困惑。
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public class SimpleTest {
@Rule
public TestWatcher testWatcher1 = new TestWatcher() {
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
public void evaluate() throws Throwable {
try {
System.out.println("testWatcher1");
base.evaluate();
} catch (Throwable e) {
e.printStackTrace();
}
}
};
}
};
@Rule
public TestWatcher testWatcher2 = new TestWatcher() {
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
public void evaluate() throws Throwable {
try {
System.out.println("testWatcher2");
base.evaluate();
} catch (Throwable e) {
e.printStackTrace();
}
}
};
}
};
@Test
public void test() {
System.out.println("test");
}
}
输出:
testWatcher2
testWatcher1
test
Process finished with exit code 0
经过进一步调查:添加System.out.println(base.toString());
在每个evaluate()
调用的内部均会产生一些非常有趣的输出:
testWatcher2
com.glenpierce.Tests.base.SimpleTest$1$1@3c09711b
testWatcher1
org.junit.internal.runners.statements.InvokeMethod@5cc7c2a6
test
Process finished with exit code 0
似乎每个TestWatcher都在寻找不同的范围。 我是无意中嵌套了这些东西吗?
JUnit中的规则经过设计,以便它们彼此链接。 一个规则中的base.evaluate()
会使下一个规则运行,直到所有规则都运行为止。 仅当所有规则都调用base.evaluate()
才运行测试方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.