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


195

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


私はすでにこのリンクを通過しましたhttp://cwd.dhemery.com/2011/01/what-junit-rules-are-good-for/
Dipak

私はこの記事@Ruleかなりよく説明していることを発見しました。特に最後のセクション「イベントのシーケンスの詳細」をチェックしてください
PeterPerháčFeb

注射の概念に似ていると思いますよね?
Chao

そのリンクを共有してくれてありがとう。1つは明確ではありません。DEFAULT Statement.evaluate()はいつ呼び出されますか?すべてのルールのevaluate()の前に呼び出されますか?私はそれらすべての後に推測しています。
MasterJoe2 2018

@ testerjoe2デフォルトのステートメントを完全に無視することを選択できます。あなたはそれに委任することを選ぶかもしれませんし、単にあなた自身のいくつかの他の声明でそれを完全に置き換えるかもしれません。それは呼ばれません、あなたはそれを呼ぶかもしれません。それはポイント10でした:「スクリーンショットステートメントのevaluate()メソッドは、デフォルトステートメントのevaluate()メソッドを呼び出します。」
PeterPerháč18年

回答:


155

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

たとえば、ExternalResourceはテストメソッドの前後にコードを実行します。andを使用する必要は@Beforeありません@After。使用するExternalResourceのではなく、@Beforeかつ@After優れたコードの再利用のための機会を提供します。同じルールを2つの異なるテストクラスから使用できます。

設計は以下に基づいています:JUnitのインターセプター

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


1
訂正:「たとえば、ExternalResourceはテストクラスの前後にコードを実行します。」apply()を使用して、ExternalResourceをテスト間で実行することについて何かがあります。
derekm

62

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インターフェイスを提供します。

参照用の便利なリンクを次に示します。


4
オブジェクトを削除/クリアするコードを書かずに削除されますか?
Dror

github.com/junit-team/junit4/blob/master/src/main/java/org/…のソースを確認します。フォルダーはbefore()コールバックメソッドで作成され、after()コールバックメソッドで削除されます。 ..
Pierluigi Vernetto 2017

1
TemporaryFolderが削除される理由を理解していない人にとっては、Junitによって提供されるTemporaryFolderが、自動的に削除される一時フォルダーとして機能するためです。つまり、ティアダウンステップは、TemporaryFolderクラス自体の一部です。
MindaugasBernatavičius19年

17

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


2
ステートメントのメソッドは実行されません。
Hemanth 2017

0

ルールは、一般的な方法で各テストメソッドの動作を強化するために使用されます。JUnitルールはテストメソッドをインターセプトし、テストメソッドが実行を開始する前とテストメソッドが実行された後に何かを実行できるようにします。

たとえば、@ Timeoutルールを使用して、すべてのテストのタイムアウトを設定できます。

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

@TemporaryFolderルールは、一時フォルダー、ファイルを作成するために使用されます。テストメソッドが実行されるたびに、一時フォルダが作成され、メソッドの実行後に削除されます。

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

このリンクで、junitが提供する組み込みルールの例を確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.