という事は承知しています、
@Before
および@BeforeClass
は、それぞれ各テストの前、またはテストクラス全体で実行されます@Rule
および@ClassRule
は、それぞれ各テストまたはテストクラス全体をラップします。各テストメソッドの前にいくつかのデータを初期化する必要があるとしましょう。
@Before
と@Rule
のどちらを使用するかを決定するにはどうすればよいですか?ある条件下では、ある条件が他の条件よりも優先されますか?同じ質問が@BeforeClass
vs .@ClassRule
にも当てはまります。
_@Rule
_を使用するには、 here のように、TestRule
(preferred)またはMethodRule
を実装するクラスが必要です。 _@Before
_および_@After
_では、すべてのテストケースで新しいメソッドを記述する必要がありますが、_@Rule
_は、既存のコードのインスタンス化にすぎないため、そうではありません。
したがって、多くのテストケースで使用するsetUp()
およびtearDown()
に_@Before
_および_@After
_を使用する場合、実際にはより良いアイデアです。 _@Rule
_のために_code reuse
_を使用する。一意の_@Before
_および/または_@After
_を必要とするテストケースがある場合は、これらの注釈が適しています。
いくつかの例を示したもう少し詳細な回答については、 here をご覧ください。 Ajitは非常によく説明しています。
実際、@ Quwinが示唆したように、 JUnit 4.12 API doc に準拠しています。
TestRule
は、以前に@Before
、@After
、@BeforeClass
、または@AfterClass
のアノテーションが付けられたメソッドで実行できたすべてを実行できますが、TestRule
s (1)より強力な、および(2)プロジェクトとクラス間でより簡単に共有できます。
TestRule
sがより強力な方法:
TestRule
の実装クラスが知られています。これは、すぐに使用できる便利なルールです。
これがどのように役立つかの例については、提供されているこれらのTestRulesを参照するか、独自に作成してください。
ErrorCollector
:1つのテストメソッドで複数のエラーを収集しますExpectedException
:スローされた例外に関する柔軟なアサーションを作成しますExternalResource
:サーバーの起動と停止、たとえばTemporaryFolder
:新しいファイルを作成し、テスト後に削除しますTestName
:メソッド中に使用するテスト名を覚えておいてくださいTestWatcher
:メソッド実行中のイベントでロジックを追加Timeout
:設定時間後にテストを失敗させますVerifier
:オブジェクトの状態が正しくない場合、テストに失敗します
ルールのもう1つの利点は、1つのテストケースで複数のルールを使用できることです。 RuleChain
を使用して、ルールを実行する順序を指定できます。