2013-07-25 17 views
6

私は、Spring Bean間の広範囲な結合を持つ大規模なSpringベースのプロジェクトに取り組んでいる春の初心者です。私は、アプリケーション全体の機能のサブセットを実行するいくつかの統合テストを作成しようとしています。そうするために、私はオートワイヤリングのいくつかを無効にしたいと思います。 例えば、私はクラスでSpring @Autowireアノテーションをオーバーライドしてフィールドをnullに設定するにはどうすればよいですか?

public class MyDataServiceImpl implements MyDataService { 
    @Qualifier("notNeededForMyDataServiceTest") 
    @Autowired 
    private NotNeededForMyDataServiceTest notNeededForMyDataServiceTest; 
    //... 
} 

とコンテキストファイルがあるとします。私のテストでは

<bean id="myDataService" 
     class="MyDataServiceImpl"> 
</bean> 

を、私はnotNeededForMyDataServiceTestフィールドを使用する必要がありません。私は@Autowired注釈をオーバーライドして、XMLファイルで、おそらく、notNeededForMyDataServiceTestはnullに設定することができますいくつかの方法はありますか?私はJavaクラスを変更したくないですが、私はnotNeededForMyDataServiceTestの(問題のある)設定を避けたいと思います。

私がやってみました:

動作しません
<bean id="myDataService" 
     class="MyDataServiceImpl"> 
    <property name="notNeededForMyDataServiceTest"><null/></property> 
</bean> 

。 IntelliJは、 "プロパティ 'notNeededForMyDataServiceTest'を解決できません。"、明らかにそのフィールドにゲッターとセッターがないためです。

私は春のフレームワーク3.1.3を使用しています。

+0

あなたは試しましたか?これはあなたに文字列nullを与えますが、少なくとも値を設定することができます – Jayz

答えて

5

は、私はJava構成に

@Configuration 
//This will load your beans from whichever xml file you are using 
@ImportResource("classpath:/path/beans.xml") 
public class TestConfigLoader{ 
    // This will declare the unused bean and inject MyDataServiceImpl with null. 
    public @Bean(name="notNeededForMyDataServiceTest") NotNeededForMyDataServiceTest getNotNeededForMyDataServiceTest(){ 
     return null; 
    } 
... any other configuration beans if required. 
} 

を混合の自由を取り、そのようなあなたのテストクラスに注釈を付ける:

// In your test class applicationContext will be loaded from TestConfigLoader 
@ContextConfiguration(classes = {TestConfigLoader.class}) 
public class MyTest { 
    // class body... 
} 
3

これら助けることができる:

とプロファイルを:

あなたは、XML構成で異なる豆の定義を作成し、-Dspring.profiles.active="profile1,profile2" ENVを使用してそれらを活性化できます。以下の設定は動作するはず

+0

必要なだけ正確なリンク – Jayz

+0

ありがとうポインタ!彼がコード例を提供したので、私は阿部にボーナスを与えています。 – kc2001

3

をあなたは間違っ@Autowiredメカニズムを使用しています。修飾子は、ではなく、設定する必要があるプロパティであるです。これは実際にはBeanの名前なので、同じタイプの複数のBeanが同じコンテキストで定義されている場合にコンテナが特定のインスタンスを選択できるようになります。

したがって、コンテナはタイプNotNeededForMyDataServiceTestのBeanと名前(実際にはXMLのbean idとなります):notNeededForMyDataServiceTestを探します。

アプリケーションのコンテキストでタイプNotNeededForMyDataServiceTestのBeanが定義されていない場合、そのフィールドに何も挿入しないようにコンテナに指示することをお勧めします。

@Autowired(required = false) 
NotNeededForMyDataServiceTest someOptionalDependency; 

は、このアプローチの唯一の欠点は、そのフィールドに注入する何もない場合、コンテナは、実行時に文句を言うことはありませんということでしょう(そしておそらく:それはfalseに注釈のrequired属性を設定するだけで達成することができましたコードが実稼働環境で実行されているときにこのサニティチェックが必要になります)。


あなたが(またはあなたが何らかの理由でそのコードを編集することはできません)という依存関係をオプションにしたくない場合は、明示的に設定することで、そのフィールドのモック/ null価値を提供する必要がありますあなたの文脈でその1つの選択肢は、@ Abeの回答のようにXMLの代わりにJava設定を使用することですが、もう1つの方法はnullthis questionのような)を返すファクトリBeanを利用することです。

+0

お返事ありがとうございます。残念なことに、あなたが正しいです - 我々は生産の健全性チェックが欲しいです。 – kc2001

+0

私は2つの選択肢を提供するために私の答えを編集しました... –

+0

ありがとう!私はあなたの答えと阿部の間のボーナスを分割したいですが、私はできません。彼がコード例を提供したので、私は阿部にボーナスを与えています。 – kc2001

関連する問題