1

私は次のことを行う統合テストを持っています:

@ContextConfiguration( locations={..path to xmls..} )
class IntegTestBase{

   --- some field initializations; ---
}

class MyIntegTest extends IntegTestBase{

   @Test
   public testingMethod(){
      MyClass obj = new MyClass();
      obj.methodToBeTested();

      ---- some assertions ----
   }
}

class MyClass{

   @Autowired
   Something obj1;

   public int methodToBeTested(){

      --- Somecode ---
   }
}

上記のコードでは、テストケースを実行すると、MyClassオブジェクトが作成され、すべてのフィールドが自動配線されると思いました。しかし、何が起こったのかというと、テストの実行時にすべての自動配線フィールドがnullでした。Bean定義が見つからないことについては文句を言わなかったので、テストコンテキストがここに表示されていると思います。しかし、なぜそれが配線されていないのか理解できません。

一方、テストクラスでこれらのフィールドを作成して自動配線し、作成したオブジェクトに設定することができます。誰かがフィールドがnullである理由を知ることができますか?

4

2 に答える 2

3

new演算子を使用してSpringBeanを作成しています。

MyClass obj = new MyClass();

これはほとんど機能しません1。Springコンテナに、完全に動作する初期化されたBeanのインスタンスを提供するように依頼する必要がありますMyClass。たとえば、テストケース内の自動配線/DIを使用します。

@ContextConfiguration( locations={..path to xmls..} )
class IntegTestBase{

  @Autowired
  protected MyClass obj;

}

テストの後半でそれを使用するだけです。

@Test
public testingMethod(){
  //don't recreate `obj` here!
  obj.methodToBeTested();

  ---- some assertions ----
}

実際、これはSpringTestSupportが提供する機能です。また、がシングルトンのobj場合、すべてのテストでまったく同じインスタンスを指すことを覚えておく必要がありますが、通常は問題にはなりません。MyClass

1理論的には完全なAspectJで可能ですが、その道を進みたくはありません。

于 2013-01-08T21:19:42.297 に答える
1

MyClass春の豆ですか?その場合は、 (を使用して)自分でインスタンスを作成するのではなく、他の依存関係と同じように作成する必要があります。new@Autowired

class MyIntegTest extends IntegTestBase{

   @Autowired
   MyClass obj;

   @Test
   public testingMethod(){
      obj.methodToBeTested();
      // ...
   }
}
于 2013-01-08T21:19:46.953 に答える