org.junit.rules.MethodRule和org.junit.rules.TestWatchman已被弃用。
一个有趣的注释是:https://github.com/junit-team/junit/pull/519,部分: “许多开发人员都是坚持使用MethodRule的正当理由,而JUnit团队没有计划删除对MethodRule的支持......”
http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html文件: “不推荐使用。不推荐使用MethodRule。请使用TestWatcher实现TestRule。”并提供了一些示例代码。
标记这些已弃用的原因是什么? TestWatcher和被弃用的TestWachman之间的权衡是什么? 您是否有关于此特定主题的概要或概述的良好链接?
答案 0 :(得分:21)
原因很简单,TestRule
计划取代MethodRule
。 MethodRule
是在4.7中实现的,它是一个带有一个方法的接口:
Statement apply(Statement base, FrameworkMethod method, Object target)
FrameworkMethod
(几乎)是一个内部JUnit类,它不应该首先暴露出来。 object
是运行该方法的对象,例如,您可以使用反射修改测试的状态。
TestRule
,但是:
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