2012-03-01 6 views
6

私は外部WebサービスにアクセスするWebアプリケーションを持っています。私は、Webアプリケーション用の自動受諾テストスイートを作成しています。私はそれが深刻なオーバーヘッドを持っているので、外部Webサービスを呼び出すしたくない、私はこのWebサービスを模擬したい。 Webアプリケーションのアプリケーションコンテキストを変更せずに、これをどのように達成できますか?私たちは最近Spring 3.1に移行したので、私は新しい環境機能を使いたいと思っています。これらの新機能は、この単一のWebサービスをオーバーライドしてアプリケーションのコンテキストをそのままにしておくのに役立ちますか?アプリケーションコンテキストで定義された単一のBeanをオーバーライドする方法

答えて

4

これを行うには、BeanFactoryPostProcessorを使用します。これは、この模擬したいテストシナリオにのみ登録されています。

BeanFactoryPostProcessorを使用すると、アプリケーション・コンテキストを作成して移入した直後にアプリケーション・コンテキストを変更できます。特定のBeanの名前を検索し、別のBeanを登録することができます。

public class SystemTestBeanFactoryPostProcessor implements BeanFactoryPostProcessor 
{ 
    @Override 
    public void postProcessBeanFactory(final ConfigurableListableBeanFactory factory) throws BeansException 
    { 
     final MyInterface myInterface = new MyInterfaceStub(); 
     factory.registerSingleton("myInterfaceBeanName", myInterface); 
    } 
} 

これにより、スタブ/モックする豆だけを上書きすることができます。

これは、このようなことを行うための「最新の3.x」方法であるとは確信していません。しかし、それは非常に簡単で実装が簡単です。

9

私はSpringの@Profile機能を使用しますが、これはあなたが参照していた「環境機能」です。例えば

@Service @Profile("dev") 
public class FakeWebService implements WebService { 
} 

@Service @Profile("production") 
public class ExternalWebService implements WebService { 
} 

EDIT

そして、あなたのテストに使用するプロファイルを指定するには:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/app-config.xml") 
@ActiveProfiles("dev") 
public class MyAcceptanceTest { 
} 

は、より多くの詳細については、春のドキュメントのthis sectionを参照してください。

あり生産でアクティブなプロファイルを設定するには、いくつかの方法がありますが、私が前に使ってきた方法は、web.xmlにある:

あなたがあなたの中で使用している `Profile`指定しない
<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>spring.profiles.active</param-name> 
     <param-value>production</param-value> 
    </init-param> 
</servlet> 
+0

テスト構成(または本番構成)? –

+0

いくつかの例で私の答えを更新しました。必要に応じてbeans.xmlでプロファイル設定を使用することもできます。 – seanhodges

+0

+1ありがとうございます!非常に良い例。 –

関連する問題