3

でいくつかの静的変数を作成しました@BeforeClass。それらをnullに設定する必要があります@AfterClassか?これらはIOに関連しないオブジェクトです。

例:

public class ClassTest{
   private static String staticText;   
   @BeforeClass
   public static void setUp(){
      staticText="long text";
   }
//test methods

//Is this necessary
@AfterClass
public static void tearDown(){
   staticText=null;
   }    
}
4

3 に答える 3

9

短い答え:

静的メンバーの場合:JUnit3とJUnit4の両方で、静的メンバーは、(@AfterClassメソッドなどで)明示的に参照を無効にしない限り、ガベージコレクションの対象にはなりません。

非静的メンバーの場合:JUnit3を使用している場合は、@Afterメソッドで非静的メンバー変数を無効にすることをお勧めします。デフォルトのテストランナーでJUnit4を使用している場合、この方法は不要です。

長い答え:

JUnitは、テストクラスに存在するテストメソッドごとに、テストクラスの個別のインスタンスを作成します。JUnit3は、テストスイートの実行が完了するまで、これらすべてのインスタンスへの参照を保持するため、tearDown()メソッドでこれらの参照をクリーンアップすることをお勧めします。(もちろん、静的変数のインスタンスは、それが属するクラスのすべてのインスタンスに1つしか存在しないため、これは非静的変数にとってより重要です。)

JUnit4には、テストメソッドごとにテストクラスの個別のインスタンスを作成する動作がありますが、デフォルトのテストランナーを使用している限り、現在実行中のテストであるテストクラスのインスタンスへの参照のみが保持されます。属する。その結果、非静的メンバー変数は、メソッドで明示的に無効にしなくてもクリーンアップされますtearDown()

ただし、(アノテーションを介して)カスタムJUnit4テストランナーを使用する場合、@RunWithテストクラスインスタンスへの参照を保持する期間が保証されないことに注意してください。

于 2012-12-06T23:12:51.347 に答える
2

静的変数は、JVM が終了するまで存続します。静的にする理由がある場合 (複数のテストで使用され、初期化にコストがかかる) は自由に行ってください。使用が終わったらクリーンアップしてください。

非静的の場合、他の人が言ったように、JUnit はこれらを独自にクリーンアップします。

于 2012-12-17T19:17:56.583 に答える
0

良いテストは、それ自体をきれいにする必要はありません。彼らはデータを準備するだけです。他のテストはそれらのデータに依存すべきではありません。実際には、データベース接続を閉じるか、他の長期的なリソースをクリーンアップする必要がある場合があります。ただし、一部の純粋主義者は、その場合、それはもはや単体テストではないと言うでしょう。不適切に設計されたレガシー コードを使用する場合、使用するフレームワークのいくつかの静的変数を消去する必要がある場合があります (例: spring SecurityContext)。通常、そのようなコードは、そのようなクリーニングを避けるためにリファクタリングできます

于 2012-12-08T12:18:45.490 に答える