web-dev-qa-db-ja.com

JUnit @Beforeと@Rule

という事は承知しています、

  • @Beforeおよび@BeforeClassは、それぞれ各テストの前、またはテストクラス全体で実行されます
  • @Ruleおよび@ClassRuleは、それぞれ各テストまたはテストクラス全体をラップします。

各テストメソッドの前にいくつかのデータを初期化する必要があるとしましょう。

@Before@Ruleのどちらを使用するかを決定するにはどうすればよいですか?ある条件下では、ある条件が他の条件よりも優先されますか?同じ質問が@BeforeClass vs .@ClassRuleにも当てはまります。

26
sam

_@Rule_を使用するには、 here のように、TestRule(preferred)またはMethodRuleを実装するクラスが必要です。 _@Before_および_@After_では、すべてのテストケースで新しいメソッドを記述する必要がありますが、_@Rule_は、既存のコードのインスタンス化にすぎないため、そうではありません。

したがって、多くのテストケースで使用するsetUp()およびtearDown()に_@Before_および_@After_を使用する場合、実際にはより良いアイデアです。 _@Rule_のために_code reuse_を使用する。一意の_@Before_および/または_@After_を必要とするテストケースがある場合は、これらの注釈が適しています。

いくつかの例を示したもう少し詳細な回答については、 here をご覧ください。 Ajitは非常によく説明しています。

26
Quwin

実際、@ Quwinが示唆したように、 JUnit 4.12 API doc に準拠しています。

TestRuleは、以前に@Before@After@BeforeClass、または@AfterClassのアノテーションが付けられたメソッドで実行できたすべてを実行できますが、TestRules (1)より強力な、および(2)プロジェクトとクラス間でより簡単に共有できます。


TestRulesがより強力な方法

TestRuleの実装クラスが知られています。これは、すぐに使用できる便利なルールです。

これがどのように役立つかの例については、提供されているこれらのTestRulesを参照するか、独自に作成してください。

  • ErrorCollector:1つのテストメソッドで複数のエラーを収集します
  • ExpectedException:スローされた例外に関する柔軟なアサーションを作成します
  • ExternalResource:サーバーの起動と停止、たとえば
  • TemporaryFolder:新しいファイルを作成し、テスト後に削除します
  • TestName:メソッド中に使用するテスト名を覚えておいてください
  • TestWatcher:メソッド実行中のイベントでロジックを追加
  • Timeout:設定時間後にテストを失敗させます
  • Verifier:オブジェクトの状態が正しくない場合、テストに失敗します

ルールのもう1つの利点は、1つのテストケースで複数のルールを使用できることです。 RuleChainを使用して、ルールを実行する順序を指定できます。

7
sam