2012-10-09 7 views
10

起動時にアプリケーションコンテキストxmlが初期化される統合テストを作成しています。テストクラスには、特定のBean 'X'(既にxmlで定義されている)を使用するテストメソッドがいくつかあります。私の実際の要件は、テストメソッドの1つのみについてBean Xをモックすることです。別のコンテキストの擬似バージョンと1つのコンテキストのSpring Beanを置き換えます。

テストメソッドの中で:ClassPathXMLApplicationContextを使用してモックBean 'M'だけを使って別のアプリケーションコンテキストを作成しようとしました。

今私は2つのアプリケーションコンテキスト(AC): と(実際の豆Xを含む)テストケースの起動時に作成された1つ 2つモックビーンMを有する(試験方法内ClassPathXMLApplicationContextを使用して作成)。

AC:2内のモックBean定義 'M'を使用して、AC:1内の実際のBean定義 'X'を置き換えたいとします。

誰かがこれにいくつかの光を投げてもらえますか?

答えて

16

リフレッシュしたApplicationContextのBeanをクローズして再度リフレッシュしない限り、そのBeanを置き換える明確な方法はありません。

これをエミュレートするには、実行時に置き換えたいターゲットのProxyを使用することが一般的です。

あなたは簡単にフレームワークのAOPのサポートクラスを使用してそれを行うことができます。

<bean id="realBean" class="RealClass" /> 
<bean id="mockBean" class="MockClass" /> 
<bean id="targetSource" class="org.springframework.aop.target.HotSwappableTargetSource"> 
    <constructor-arg ref="realBean>" /> 
</bean> 

<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean> 
    <property name="targetSource" ref="targetSource" /> 
</bean> 

 

@Test 
public void testWithMockBean() { 
Object real = targetSource.swap(mock); 
.... 
// do your test work 
... 
targetSource.swap(real); 

} 
23

次のことが可能です。

  • あなたは春3.1を持っている場合Profileアノテーションを使用します。
  • 春のコンテキスト

Primary注釈

  • 使用qualifiers
  • ワイヤー豆を自分で使用して、私はさらに多くのオプションがあると確信しています。

  • +0

    原発は私が探していたまさにでした。ありがとう! – daniel

    +2

    ** @ Primary **は最良の答えです: "複数の候補者がオートワイヤード(...)する資格がある場合、Beanに優先権を与える必要があることを示します。" – jsosnowski

    +0

    私にとっては\プライマリも最高の答えですが、 \ @Qualifierが使用されるときは? – deFreitas

    3

    <beans> 
        <import resource="classpath*:appContext.xml" /> 
        <bean id="mockbeanOfX" class=....../> 
    </beans> 
    

    でtestApplicationContextを作成し、あなたのテストケースでは、このテスト・アプリケーション・コンテキストをロードします。これで、アプリケーションコンテキストからモックBeanを取得し、必要に応じてそのBeanを渡すことができます。

    関連する問題