Junit @Rule与@ClassRule注解

2,491 阅读1分钟

@Before/@After Vs @Rule

如果我们想再多个测试类中服用编写的@Before装饰的setUp()方法和@After装饰的tearDown()方法时,可以考虑使用@Rule注解。
在使用@Rule注解时,@Rule修饰的类需要实现TestRuleMethodRule(计划被@TestRule所取代)接口中的apply方法。

@Rule Vs @ClassRule

@ClassRule对标@BeforeClass/@AfterClass
@Rule对标@Before/@After
@ClassRule 是 static方法,@Rule不是。但@ClassRule@Rule修饰的成员变量都必须为public

TestRule 示例:

public class TestMethodNameLogger implements TestRule {
 
    private static final Logger LOG = LoggerFactory.getLogger(TestMethodNameLogger.class);
 
    @Override
    public Statement apply(Statement base, Description description) {
        logInfo("Before test", description);
        try {
            return new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    base.evaluate();
                }
            };
        } finally {
            logInfo("After test", description);
        }
    }
 
    private void logInfo(String msg, Description description) {
        LOG.info(msg + description.getMethodName());
    }
}

当我们在实现apply方法时,我们必须返回一个Statement的实例。这个实例代表着我们在Junit运行时中的测试。在调用evaluate()方法时测试被执行。

Junit的Rule可能会以任意顺序执行。如果想要控制多个Rule的执行顺序,可以使用@RuleChain

参考资料: