原因很简单,TestRule
本来打算换MethodRule
的。MethodRule
在 4.7 中实现了引入,它是一个具有一种方法的接口:
Statement apply(Statement base, FrameworkMethod method, Object target)
FrameworkMethod
(几乎)是一个内部 JUnit 类,它本来就不应该被公开。object
是将运行该方法的对象,例如,您可以使用反射修改测试的状态。
TestRule
然而,在 4.9 中引入的是:
Statement apply(Statement base, Description description)
Description
是一个包含测试描述的不可变 POJO。在测试中修改状态的方法是使用TestRule
. 这是一个完全清洁的设计。
TestWatchman(MethodRule)
和之间的具体区别TestWatcher(TestRule)
很小,只是 TestWatcher 有更好的错误处理,所以应该优先使用它。两者都有可覆盖的方法,例如succeeded()
, failed()
, starting()
, finished()
。
public static class WatchmanTest {
private static String watchedLog;
@Rule
public TestWatcher watchman= new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
watchedLog+= description + "\n";
}
@Override
protected void succeeded(Description description) {
watchedLog+= description + " " + "success!\n";
}
};
@Test
public void fails() {
fail();
}
@Test
public void succeeds() {
}
}
TestWatcher(TestRule)
处理覆盖方法中的异常。如果抛出异常,则测试方法在测试执行后失败,而不是在测试期间失败。
有关详细信息,请参阅TestWatcher和TestWatchman