2011-11-28 11 views
6

テストスイートによってクラスが開始された場合、JUnit 4テストクラスで知る方法はありますか? すべてのテスト(メモリ内DBに関する)前に実行したいグローバルなものがあるので、テストスーツで実行すると思っていました。しかし、私はまだテストスーツなしで一度に1つのテストを開始できるようにしたいので、テストの@前の部分でグローバルなものを初期化する必要があるかどうかを知る必要があります。それが可能ならば?テスト呼び出し:すべてのテストスイートに共通の設定方法

答えて

5

これを達成するにはいくつかの方法があります。最も簡単で簡単なのは、データベースを設定してグローバルフラグを設定するスイートの最初と最後で実行される 'テスト'を持つことです。 @Beforeと@Afterテストでは、このフラグをチェックし、必要に応じてセットアップ/ティアダウンを行います。

@RunWith(Suite.class) 
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class}); 

これは、最も簡単な解決策ですが、それは非常に素晴らしいではないので、すっきり解決策はTestRuleを使用することです。拡張を見てくださいExternalResource。これは、テストメソッドを囲むロジックの後に&の前に実装されています。これにより、@Beforeメソッドと@Afterメソッドを除外して、どこでも同じコードを再利用することができます。

あなたのスイートでは、before/afterロジックも実装する必要があります。残念ながら、@RunWith(Suite.class)でアノテートされたクラスは実際にはインスタンス化されないため、そのクラスのコンストラクタは使用できませんが、Suiteを拡張できます。あなたがこれを実行する方法に応じて、あなたは一例として@RunWith使用して、コンストラクタのいずれかを実装する必要がありますされます:

public class MySuite extends Suite { 
    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     // set global variable 
    } 
} 

が続い

@RunWith(MySuite.class) 

を使用してテストスイートを実行するいくつかのコンストラクタがあります。それぞれ異なる状況で使用されている場合は、それぞれの次のコメントを見てください。ルールがセットアップコードを再実行しないように、グローバル変数を使用する必要があります。セットアップコードだけを実行したい場合はティアダウンコードを実行するのが難しいですが、実行することができれば上記はうまくいくでしょう。

さらに柔軟性が必要な場合(特定のメソッドに対してのみセットアップコードを実行する場合)は、How to define JUnit method rule in a suite?への私の回答を参照してください。

+0

リンクのほとんどが死んでいます。 – Nadar

2

このタイプの作業を行う方法を示すために、JUnitの@BeforeClass@AfterClassの注釈を使用します。

@BeforeClass Javadocのから:

時々、いくつかのテストは、(データベースにログインするように)計算コストが高いセットアップ を共有する必要があります。これはテストの独立性を損なう可能性がありますが、時には最適化が必要です。 @BeforeClassを使用してパブリックstatic void no-argメソッドに注釈を付けると、そのクラス内のテストメソッドの前に一度実行されます( )。スーパークラスの@BeforeClassメソッド は、現在のクラス の前に実行されます。

+1

これは、1つのテストクラスファイル内のいくつかの注釈付き@Testメソッドに関連しています。これは、私が扱っているシナリオではないので、いくつかのテストクラスに必要です。 – stdcall

0

共通の設定を行う補助クラスに委譲する各テストスイートには、@BeforeClassコードを配置できます。補助クラスは、既にセットアップが完了したかどうかを記録するstatic booleanを持つことができます。すでに完了している場合、補助クラスは何も行いません。

関連する問題