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

2022-09-03 13:35:05

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 文档:“已弃用。方法规则已弃用。使用TestWatcher来实现TestRule“,并提供了一些示例代码。

将这些标记为已弃用的原因是什么?TestWatcher和已弃用的TestWachman之间的权衡是什么?您是否有关于此特定主题的概要或概述的良好链接?


答案 1

原因很简单,本来打算更换的。 在4.7中引入,它是一个具有一种方法的接口:TestRuleMethodRuleMethodRule

Statement apply(Statement base, FrameworkMethod method, Object target)

FrameworkMethod(几乎)是一个内部 JUnit 类,它本来就不应该公开。 是将在其上运行方法的对象,因此,例如,您可以使用反射修改测试的状态。object

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

Statement apply(Statement base, Description description)

Description是包含测试描述的不可变 POJO。在测试中修改状态的方法是使用 在测试中正确封装。这是一个完全干净的设计。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() {
   }
}

TestWatcher(TestRule)处理重写方法中的异常。如果引发异常,则测试方法在执行测试后(而不是在测试期间)失败。

有关更多信息,请参见 TestWatcherTestWatchman。


答案 2

推荐