15

org.junit.rules.MethodRule と org.junit.rules.TestWatchman は廃止されました。

https://github.com/junit-team/junit/pull/519にある興味深いメモの 1 つは、「多くの開発者が MethodRule に固執する正当な理由であり、JUnit チームは MethodRule のサポートを削除する予定はありません。 ..」

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.htmlドキュメント: 「非推奨。MethodRule は非推奨です。代わりに TestRule を実装する TestWatcher を使用してください。」いくつかのサンプルコードを提供します。

これらを非推奨とマークする理由は何ですか? TestWatcher と非推奨の TestWachman の間のトレードオフは何ですか? この特定のトピックの概要または概要への適切なリンクはありますか?

4

1 に答える 1

22

理由は単純で、TestRule交換する予定だったからMethodRuleです。MethodRule4.7 で導入され、1 つのメソッドを持つインターフェイスです。

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)オーバーライドされたメソッドで例外を処理します。例外がスローされた場合、テスト メソッドはテストの実行中ではなく実行後に失敗します。

詳細については、TestWatcherおよびTestWatchmanを参照してください。

于 2012-10-19T08:10:17.163 に答える