繁体   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