如果我们想再多个测试类中服用编写的 @Before
装饰的 setUp()
方法和 @After
装饰的 tearDown()
方法时,可以考虑使用 @Rule
注解。
在使用 @Rule
注解时, @Rule
修饰的类需要实现 TestRule
或 MethodRule
(计划被 @TestRule
所取代)接口中的 apply
方法。
@ClassRule
对标 @BeforeClass/@AfterClass
@Rule
对标 @Before/@After
@ClassRule
是 static方法, @Rule
不是。但 @ClassRule
和 @Rule
修饰的成员变量都必须为 public
。
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
。