[英]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.