@Before/@After Vs @Rule
如果我们想再多个测试类中服用编写的@Before装饰的setUp()方法和@After装饰的tearDown()方法时,可以考虑使用@Rule注解。
在使用@Rule注解时,@Rule修饰的类需要实现TestRule或MethodRule(计划被@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。