2017-02-09 6 views
0

Junitのテストコードは次のようになります。JUnitテストで手動bean autowiringが機能しない

private static boolean setupDone = false; 
private Box box; 

@Before 
public void setup(){ 

    if (setupDone){ 
    return true; 
    } 

    box = new BoxCreator(this.applicationContext); 

    applicationContext.getAutowireCapableBeanFactory().autowireBean(box); 

    setupDone = true; 
} 

@Test 
public void Test1(){ 
    String response = box.getBoxResponse(); 

    ...asserts go here as usual.... 
} 

@Test 
public void Test2(){ 
String response = box.getBoxResponse(); 

...asserts go here as usual.... 
} 

ここで、setupメソッドは、setupDone変数によって必要に応じて1回だけ実行されます。

Boxオブジェクトのインスタンスを作成した後の設定メソッドは、上記のコードのようにautowearします。意図は、このクラスのシングルトンを持ち、すべてのテストで同じインスタンスを使用することです。

今の問題は、いずれの試験方法は、ボックスオブジェクトの値を取得し、第二の試験方法はヌルとしてボックスを見て最初に実行することです。 2番目のテストメソッドが実行されたときになぜnullになるのか不明です。

答えて

0

私は、テストメソッドの実行ごとにテストクラスの同じインスタンスを使用していないと思われます。

「ボックス」を静的にすると、より効果的です。 "setupDone"と "box"は@Beforeメソッドで一緒に初期化され、静的なクラスであれ、グローバル変数であれインスタンスと同じ場所に存在する必要があることに注意してください。

それに伴う問題は、一つのテストは、オブジェクトまたはその内部のオブジェクトの状態を変更する場合は、次のテストが正しく動作しない場合がありますということです。

+0

同じテストクラスで異なるテストが異なるアプリケーションコンテキストを持つと言うことを意味しますか? – Hary

+0

各テストには、異なる 'this'とすべてのインスタンス変数があります。静的変数はクラスに残っており、 'this'のどのインスタンスに関係なく同じです。 –

0

リーMeadorに述べたように、JUnitは各@Testメソッドを呼び出す前に、テストクラスの新しいインスタンスを作成します。これにより、テストメソッド間の独立性が提供され、テストコード内の意図しない副作用を回避します。各テストは、以前のテストの影響を受けずに個別に実行する必要があります。

+0

JUnitテストでアプリケーションコンテキストやBeanファクトリはどのように機能しますか?すべてのテストでは、独自のテストクラスインスタンスと別のアプリケーションコンテキストまたはBeanファクトリを使用します。それはどういう仕組みですか? – Hary

関連する問題