为什么JUnit MethodRule和TestWatchman已被弃用?

Fra*_*ler 15 java testing junit unit-testing

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之间的权衡是什么?您是否有关于此特定主题的概要或概述的良好链接?

Mat*_*ell 22

原因很简单,TestRule有计划更换MethodRule.MethodRule介绍是在4.7中实现的,它是一个带有一个方法的接口:

Statement apply(Statement base, FrameworkMethod method, Object target)
Run Code Online (Sandbox Code Playgroud)

FrameworkMethod是(几乎)一个内部JUnit类,它不应该首先暴露.object是运行该方法的对象,例如,您可以使用反射修改测试的状态.

TestRule 然而,在4.9中引入的是:

Statement apply(Statement base, Description description)
Run Code Online (Sandbox Code Playgroud)

Description是一个不可变的POJO,包含测试的描述.在测试中修改状态的方法是使用a在测试中正确封装TestRule.这是一个完全清洁的设计.

除了TestWatcher具有更好的错误处理之外,TestWatchman(MethodRule)和之间的具体差异TestWatcher(TestRule)是最小的,因此应该优先使用它.两者都有重写的方法,如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() {
   }
}
Run Code Online (Sandbox Code Playgroud)

TestWatcher(TestRule)处理重叠方法中的异常.如果抛出异常,则测试方法在执行测试后失败,而不是在测试期间失败.

有关更多信息,请参阅TestWatcherTestWatchman