簡體   English   中英

為什么多個JUnit TestWatchers不產生多個測試方法調用?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM