2012-04-27 17 views
1

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

は私の試みです:私は私のテストを実行しようとすると、

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

は、しかし、私のautowired作品が配置されていない:

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); 
    } 
} 

それから私は、次の注釈を付け私のテストを持っています。私はまさに正しい道を歩いていますか?私のApplicationContextをプログラムで設定するには、このクラスでどのように配線することができますか?第二の注釈にアプリのコンテキストXMLの場所を追加

答えて

5

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

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

あなたのケースでは、統合テスト用のプロファイルを有効にすることにのみ関係しているようです。あなたのACIは不要です。あなたの統合テストをSpringの@ActiveProfilesアノテーションでマークし、どのプロファイルがアクティブであるかを指示します。

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

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

+0

私はすべての設定オプションを定義したベーステストクラスを避けることを望んでいましたが、私は選択肢がないようです(現在)。私はどのプロファイルがそれぞれのテストクラス(ここではJVMプロパティで簡単に実行されます)でアクティブになっているのを避けることを望んでいましたが、私はそれぞれのテストクラスにContextConfigurationアノテーションを配置することを避けることを望んでいました。それを基本レベルのテストに移動することで、その問題を緩和することができます。 – Scott

+0

@ActiveProfilesアノテーションは、基本クラスで使用でき、すべてのサブクラスに適用されます。さらに、その注釈には、inheritLocationsと呼ばれるものを含む多くのプロパティがあります。 Javadocを参照してください。 –

1

てみてください:上記のあなたの例で

@ContextConfiguration(locations = { 
    "classpath:applicationContext.xml" 
}) 
+0

月曜日に取得しようとしますが、現在xmlファイルがありません。このBeanを宣言するために追加するだけですか?他の場所ですべてのJava設定を使用する場合、直観に反しているようです。 – Scott

+0

いいえ、起動時にアプリコンテキストが読み込まれるようにアノテーションを変更してください。 – duffymo

関連する問題