15

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

4

1 回答 1

22

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

有关详细信息,请参阅TestWatcherTestWatchman

于 2012-10-19T08:10:17.163 回答