web-dev-qa-db-ja.com

Junit @Ruleはどのように機能しますか?

大量のコードのテストケースを作成したいのですが、テストケースの作成に使用できるように、JUnit @Ruleアノテーション機能の詳細を知りたいと思います。簡単な例を通してその機能の詳細な説明を提供する、いくつかの適切な回答またはリンクを提供してください。

177
Dipak

ルールは、テストクラス内のすべてのテストに適用される追加機能を追加するために使用されますが、より一般的な方法です。

たとえば、 ExternalResource は、@Before@Afterを使用せずに、テストメソッドの前後にコードを実行します。 @Beforeおよび@Afterではなく、ExternalResourceを使用すると、コードを再利用する機会が増えます。 2つの異なるテストクラスから同じルールを使用できます。

デザインは以下に基づいていました: JUnitのインターセプター

詳細については、 JUnit wiki:Rules を参照してください。

136
Matthew Farwell

Junitルールは、AOP(アスペクト指向プログラミング)の原則に基づいて機能します。テストメソッドをインターセプトするため、特定のテストメソッドの実行前または実行後に何かを行う機会を提供します。

以下のコードの例をご覧ください。

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

上記のテストメソッドが実行されるたびに、一時フォルダーが作成され、メソッドの実行後に削除されます。これは、Junitが提供する標準のルールの例です。

同様の動作は、独自のルールを作成することでも実現できます。 Junitは、独自のJunitルールを作成するために実装できるTestRuleインターフェイスを提供します。

参考に役立つリンクを次に示します。

52

この記事@Rulesについてかなりよく説明しています。特に最後のセクション「イベントの詳細」をご覧ください。

21
Peter Perháč

tl; drの動作:JUnitは、テストメソッドをStatementオブジェクトにラップして、statement.Execute()がテストを実行するようにします。次に、テストを実行するためにstatement.Execute()を直接呼び出す代わりに、JUnitは@Ruleアノテーションを使用してStatementをTestRuleに渡します。 TestRuleの「適用」関数は、テストにステートメントを指定すると、新しいステートメントを返します。新しいStatementのExecute()メソッドは、テストStatementのexecuteメソッドを呼び出すことができます(または、しないか、複数回呼び出します)。 JUnitには、テストを実行するだけでなく、それ以上のことを実行する新しいステートメントが追加されました。最終的にExecuteを呼び出す前に、それを再び他のルールに渡すことができます。

12