1

すべての Spring 構成を Java コードに移行中です。コマンドラインスイッチやMavenプロファイルなどに基づいて、使用しているプロファイルを設定したいという問題に遭遇しました...また、各テストに同じ注釈をすべて配置する必要がないようにしたいですクラス。これは Web アプリケーションではなく、機能テスト スイートです。

これが私の試みです:

public class CompanyApplicationContextInitializer 
  implements ApplicationContextInitializer<ConfigurableApplicationContext> {

  @Override
  public void initialize(final ConfigurableApplicationContext applicationContext) {
    final AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext();
    rootContext.getEnvironment().setActiveProfiles(System.getProperty("spring.profile.active", "local"));
    rootContext.register(LocalConfiguration.class, SauceLabsConfiguration.class);
  }
}

次に、テストに次の注釈を付けます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CompanyApplicationContextInitializer.class)

ただし、テストを実行しようとすると、自動配線された部分が見つかりません。私はまったく正しい軌道に乗っていますか?このクラスに配線して、プログラムで ApplicationContext を設定するにはどうすればよいですか?

4

2 に答える 2

5

上記の例の問題は、ApplicationContextInitializer クラス @ContextConfiguration#classes を渡していることです。#classes 属性は、Spring の @Configuration アノテーションでマークされたクラスを受け入れることを目的としています。

ApplicationContextInitializer は、WebApplicationContext へのプログラムによるアクセスが困難な Web アプリケーションで主に使用することを目的としています。「contextInitializerClasses」init-param を Spring DispatcherServlet に渡すことができ、Spring は適切なタイミングで ACI 実装を呼び出し、#refresh() の前にアプリケーション コンテキストを操作できるようにします。

あなたの場合、統合テスト用のプロファイルのアクティブ化のみに関心があるようです。したがって、ACI は不要です。Spring の @ActiveProfiles アノテーションを使用して統合テストをマークし、アクティブなプロファイルを指示します。

spring.profiles.active が JVM システム プロパティまたは環境変数として設定されている場合、指定されたプロファイルが自動的にアクティブ化されることに注意してください。つまり、ACI 実装のように System#getProperty を呼び出す必要はありません。ただし、注意すべきことの 1 つは、ACI 実装のロジックに基づいて、spring.profiles.active がシステム プロパティまたは環境変数として提供されていない場合、「local」という名前のプロファイルにフォールバックするように見えることです。文字通り "default" という名前の "予約済みのデフォルト プロファイル" があることに興味があるかもしれません。これはおそらく、「ローカル」プロファイルで探しているのと同じセマンティクスを持っています。「ローカル」プロファイルの名前を「デフォルト」に変更することを検討してください。

最後に、 @ContextConfiguration クラスで ApplicationContextInitializer サポートを提供するための未解決の改善リクエストが存在することに注意してください: https://jira.springsource.org/browse/SPR-9011。あなたはそれに時計を置きたいかもしれません。たとえば、アクティブなプロファイルが他にない場合に、プログラムで「ローカル」をアクティブ化するための簡単なオプションが可能になります。

于 2012-04-28T10:08:01.230 に答える
1

アプリ コンテキスト XML の場所を 2 番目の注釈に追加してみてください。

@ContextConfiguration(locations = {
    "classpath:applicationContext.xml"
})
于 2012-04-27T22:23:14.450 に答える