2016-05-07 9 views
7

JUnitのの@BeforeClass@AfterClassは静的に宣言する必要があります。 @BeforeClassのための良い回避策hereがあります。私はクラス内で多数の単体テストを行い、一度初期化して一度クリーンアップしたいだけです。 @AfterClassの回避策を入手する方法についてのヘルプはありますか?追加の依存関係を導入せずにJunitを使用したいと思います。ありがとう!JUnitの@AfterClass(非静的)

+1

静的メソッドを使用してセットアップを中止することは何を止めていますか?確かに、設定した状態は静的なフィールドに移動する必要がありますが、静的なスコープを持つように思えます。 –

+0

テストインスタンスを 'static'フィールドに保存します。あなたの '@ AfterClass'メソッドでそれにアクセスし、必要なクリーンアップメソッドを呼び出します。 –

+0

あなたは[JUnitの規則](https://github.com/junit-team/junit4/wiki/にセットアップとティアダウンメソッドをリファクタリングすべきよう – jamesw1234

答えて

0

@BeforeClassで説明した回避策に似たものが必要な場合は、実行されたテストの数を把握してから、すべてのテストが実行されたら最後に終了クリーンアップコードを実行します。

public class MyTestClass { 
    // ... 
    private static int totalTests; 
    private int testsRan; 
    // ... 

    @BeforeClass 
    public static void beforeClass() { 
    totalTests = 0; 
    Method[] methods = MyTestClass.class.getMethods(); 
    for (Method method : methods) { 
     if (method.getAnnotation(Test.class) != null) { 
     totalTests++; 
     } 
    } 
    } 

    // test cases... 

    @After 
    public void after() { 
    testsRan++; 
    if (testsRan == totalTests) { 
     // One time clean up code here... 
    } 
    } 
} 

これは、スーパークラスから継承されたメソッドを占め、このソリューションは、メソッドを継承しませんようthisを確認する必要がある場合は、JUnitの4を使用している前提としています。

+0

これは単純なケースでは機能するかもしれませんが、テストが無視された場合は動作しません。継承されたテストで – dkatzel

+0

@dkatzel良い点。また、[this](https://stackoverflow.com/questions/28400408/what-is-the-new-way-of-getting-all-methods-of-a-)のようなことを行うことで、継承されたメソッドを繰り返し処理することもできます。クラスを含む継承されたdefau)。おそらく一度だけ静的なものとして掃除し、 '@ AfterClass'の間にそれを世話するべきであるリソースを保つのが最善でしょう。 – kingkupps