java - 为什么不推荐使用 JUnit MethodRule和 TestWatchman?

  显示原文与译文双语对照的内容
0 0

org .junit rules .MethodRule和org .junit rules .TestWatchman已弃用。

一个有趣的说明是,网址为: https://github .com/junit team/junit/pull/519,部分: " 许多开发人员都合法理由跟着MethodRule和JUnit团队并不打算删除支持MethodRule ... "

http://junit团队.github .io/junit/javadoc/4 .10/org/junit/rules/TestWatchman 。html 文档: " 否决。 methodRule已弃用。 应该用TestWatcher实现TestRule " 并提供一些示例代码。

支持标记这些废弃的理由是什么? 什么是综合考虑TestWatcher且过时的TestWachman? 你有一个良好的链接摘要或概览在此特定主题?

时间:原作者:2个回答

0 0

原因很简单, 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)处理异常在overidden方法。 如果将抛出异常,则测试方法失败后执行测试过程中,而不是。

有关详细信息,请参阅 TestWatcherTestWatchman

原作者:
...