Java 为什么JUnitMethodRule和TestWatchman被弃用?

Java 为什么JUnitMethodRule和TestWatchman被弃用?,java,unit-testing,testing,junit,Java,Unit Testing,Testing,Junit,org.junit.rules.MethodRule和org.junit.rules.TestWatchman已被弃用 一个有趣的注释是:,部分是: “许多开发人员都有坚持使用MethodRule的正当理由,JUnit团队没有计划取消对MethodRule的支持…” 文件: “已弃用。MethodRule已弃用。请改用TestWatcher实现TestRule。”并提供一些示例代码 将这些标记为不推荐的背后的原因是什么? TestWatcher和不推荐的TestWachman之间的权衡是什么?

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

一个有趣的注释是:,部分是: “许多开发人员都有坚持使用MethodRule的正当理由,JUnit团队没有计划取消对MethodRule的支持…”

文件: “已弃用。MethodRule已弃用。请改用TestWatcher实现TestRule。”并提供一些示例代码

将这些标记为不推荐的背后的原因是什么? TestWatcher和不推荐的TestWachman之间的权衡是什么?
你有关于这个特定主题的概要或概述的好链接吗?

原因很简单,
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具有更好的错误处理能力,因此应该优先使用。两者都有可重写的方法,如
succeed()
failed()
start()
finished()

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


有关更多信息,请参阅和

根据JUnit 4.11版的发行说明:“MethodRule不再被弃用”。请参阅为什么在JUnit 4.11中MethodRule不再被弃用?它被取消弃用,因为它仍然有一些用例:请参阅
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() {
   }
}