web-dev-qa-db-ja.com

Junit @Ruleおよび@ClassRule

TemporaryFolderルールを使用するJUnit4テストを書いています。 @Ruleと@ClassRuleの両方で正常に動作するようです。 Junit @Ruleと@ClassRuleの違いは何ですか?なぜ別のものを使用しないのですか?

31
Viktar Kava

クラスに複数のテストメソッドがある場合、区別が明確になります。

_@ClassRule_のbefore()メソッドは、テストメソッドの前に実行されます。次に、すべてのテストメソッドが実行され、最後にルールのafter()メソッドが実行されます。したがって、クラスに5つのテストメソッドがある場合、before()after()はそれぞれ1回だけ実行されます。

_@ClassRule_は静的メソッドに適用されるため、それに固有のすべての制限があります。

_@Rule_により、ルールのapply()メソッドを介してテストが実行されます。このメソッドは、ターゲットメソッドの実行前後に実行できます。 5つのテストメソッドがある場合、各メソッドのラッパーとして、ルールのapply()が5回呼び出されます。

_@ClassRule_を使用して、静的メソッドで実現できる場合は、すべてのテストメソッドで再利用できるものを設定します。

_@Rule_を使用して、テストメソッドごとに新規作成またはリセットが必要なものを設定します。

62
slim

@Ruleは、@ BeforeClassの前に実行するように設定できません。

@ClassRuleは静的メソッドである必要がありますが。

2
Slavus

参照:ルールまたはそれらを返すメソッドを参照する静的フィールドに注釈を付けます。フィールドは、パブリック、静的、およびTestRuleのサブタイプである必要があります。メソッドはpublic staticであり、TestRuleのサブタイプを返す必要があります。

TestRuleに渡されたステートメントは、BeforeClassメソッドを実行し、次にテストクラスの本体全体(標準JUnitテストクラスの場合はすべての含まれるメソッド、スイートの場合は含まれるすべてのクラス)、最後にAfterClassを実行します。メソッド。

https://junit.org/junit4/javadoc/4.12/org/junit/ClassRule.html

0
Omprakash