web-dev-qa-db-ja.com

すべてのjunitテストの後のクリーンアップ

私のプロジェクトでは、すべてのテストの前にリポジトリのセットアップを行う必要があります。これは、いくつかのトリッキーな静的ルールを使用して行われます。しかし、すべてのテストの後にクリーンアップを実行する方法がわかりません。すべてのテストメソッドの数を参照する魔法の静的な数を保持したくないので、常に維持する必要があります。

最もありがたい方法は、すべてのテストの後に呼び出されるリスナーを追加することです。 JUnit4にはすでにそのインターフェイスがありますか?


編集:これは@BeforeClassと@AfterClassとは関係ありません。@ AfterClassで注釈されたメソッドが最後に呼び出されるかどうかを知る必要があります。

38

JUnit 4.9を使用しています。これは役立ちますか?:

import junit.framework.TestCase;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({First.class,Second.class,Third.class})
public class RunTestSuite extends TestCase {
    @BeforeClass
    public static void doYourOneTimeSetup() {
        ...
    }

    @AfterClass
    public static void doYourOneTimeTeardown() {
        ...
    }    
}

編集:私のソリューションがあなたが探しているものであると私は非常に肯定的です(あなたが質問を誤解しない限り)。つまり、すべてのテストが実行された後の1つのティアダウンメソッド。リスナーは不要です。JUnitにはこの機能があります。ありがとう。

41
HellishHeat

org.junit.runner.notification.RunListener の使用をお勧めします。例:

public class TestListener extends RunListener {
  @Override
  public void testRunStarted(Description description) throws Exception {
     // Called before any tests have been run.
  }
  @Override
  public void testRunFinished(Result result) throws Exception {
     // Called when all tests have finished
  }
}

JUnit Java doc。で直接読んでください。Mavenのsurefire(ユニットテスト)プラグインまたはフェイルセーフプラグイン(統合テスト)でも、次のコードをプラグイン構成に追加することで使用できます。

<properties>
  <property>
    <name>listener</name>
    <value>com.innovatrics.afismq.it.TestListener</value>
  </property>
</properties>
40
Juraj Michalak

同じ問題が発生しました。
私の解決策:

  • グローバル設定の場合:(遅延)シングルトンを使用して、テストの前にインスタンス化を必要とするグローバルなものにアクセスします。このシングルトンにアクセスする最初のテストは、グローバル設定プロセスをトリガーします。
  • グローバルな分解の場合:Java shutdown hook:を使用します
    Runtime.getRuntime().addShutdownHook(new Thread(() -> do_your_global_cleanup())));
10
Alexander

スイートを使用する必要はなく、@ BeforeClassと@AfterClassを静的として追加するだけです

public class Tests {

    @BeforeClass
    public static void doYourOneTimeSetup()
    {
        ...
    }

    @AfterClass
    public static void doYourOneTimeTeardown() {
        ...
    }    

    @Test
    public void testYourTestcase()
    {
        ...
    }
}
0
serup

いつでもカスタムTestRunnerを作成できます。ただし、その前に、その必要性を評価する必要があります。 @BeforeClassと@AfterClassを使用することをお勧めします。私が指摘できるもう1つの例は、hibernateでユーザーが「import.sql」を使用して単体テストを実行できるようにする方法です。

0
questzen