如何按特定顺序应用我的JUnit规则?

时间:2014-05-13 06:30:44

标签: java junit timeout

我们通过测试规则对每次测试执行超时:

public abstract class BaseTestCase {
    @Rule
    public final Timeout timeout = new Timeout(60*1000);
}

然后我们的GUI测试显然必须在EDT上运行,所以他们也有一个测试规则:

public class TestSomeController extends BaseTestCase {
    @Rule
    public final RunOnEventDispatchThread runOnEventDispatchThread =
        new RunOnEventDispatchThread();

    @Test
    public void testStuff() { /* ... */ }
}

这两个规则都涉及搞乱测试运行的线程。 Timeout创建一个新线程,然后在几毫秒之后将其杀死 N RunOnEventDispatchThread在EDT上运行Runnable,然后等待任务完成。

直到JUnit 4.10这个工作正常,但我们刚刚升级到JUnit 4.11,现在似乎测试规则的顺序已经改变。

当前的JUnit似乎正在应用"逻辑"中的规则。订单,因此它适用Timeout,然后RunOnEventDispatchThread

这意味着RunOnEventDispatchThread最终会在"外部" Statement"洋葱"。所以它在EDT上运行任务,但是现在该任务产生了一个新的线程来运行测试" - 因为它产生了一个新线程,测试失败了,因为现在正在错误的线程上调用Swing调用。

显然JUnit 4.10正在以另一个顺序运行测试规则。有没有办法影响这个?

请注意,使用RuleChain解决了此类问题的现有答案。据我所知,我们不能使用RuleChain,因为该类要求两个规则在同一个类中,而我们的规则不在。{/ p>

2 个答案:

答案 0 :(得分:3)

我不熟悉JUnit中的规则排序,特别是RuleChain类。所以我快速浏览了这个课程documentation。在模板方法意义上使用时,示例代码段似乎是您的解决方案。

我可以想象以下机制会起作用:

public abstract class BaseTestCase {

    @Rule
    public final RuleChain ruleChain = createRuleChain();

    private RuleChain createRuleChain() {
        return appendInnerRules(RuleChain.outerRule(createOuterRule()));
    }

    protected TestRule createOuterRule() {
        return new Timeout(60 * 1000);
    }

    protected RuleChain appendInnerRules(RuleChain ruleChain) {
        return ruleChain; // default behavior
    }

}

public final class TestSomeController extends BaseTestCase {

    protected RuleChain appendInnerRules(RuleChain ruleChain) {
        return ruleChain.around(new RunOnEventDispatchThread());
    }

    @Test
    public void testStuff() { /* ... */ }

}

答案 1 :(得分:1)

official docs开始,您可以执行以下操作:

    @Rule
    public RuleChain chain= RuleChain
                           .outerRule(new LoggingRule("outer rule")
                           .around(new LoggingRule("middle rule")
                           .around(new LoggingRule("inner rule");

记录:

 starting outer rule
 starting middle rule
 starting inner rule
 finished inner rule
 finished middle rule
 finished outer rule