2012-07-03 33 views
52

デプロイされたWARのXML Spring構成をチェックするテストをいくつか書きたいと思います。残念ながら、いくつかのBeanでは、いくつかの環境変数またはシステムプロパティが設定されている必要があります。 @ContextConfigurationで便利なテストスタイルを使用するとき、Spring Beanが初期化される前に環境変数を設定するにはどうすればよいですか?スプリングテストで環境変数またはシステムプロパティを設定する方法は?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
public class TestWarSpringContext { ... } 

私は注釈をアプリケーション・コンテキストを設定した場合、私は春のコンテキストが初期化される前に、私は何かを行うことができますフックは表示されません。

答えて

75

あなたは、静的初期化子でシステムプロパティを初期化することができます

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
public class TestWarSpringContext { 

    static { 
     System.setProperty("myproperty", "foo"); 
    } 

} 

春のアプリケーションコンテキストが初期化される前に、静的初期化子コードが実行されます。

+8

愚かな私 - OK、それは動作します。さらに良いのは、おそらくシステムプロパティを設定する '@ BeforeClass'メソッドとそれを削除する' @ AfterClass'メソッドも動作し、それ自身の後でうまくクリーンアップするでしょう。しかし、試してみませんでした。 –

+1

@BeforeClassを試してみました。テストプロパティで他のプロパティが設定される前にシステムプロパティを設定するとうまくいきました。 – wbdarby

+0

ありがとうございます。静的なものは動作しませんでしたが、@ BeeClassの小さなメソッドが機能しました! –

45

これを行うには、Spring 4.1からは@TestPropertySourceアノテーションを使用するのが適切です。 Spring docsJavadocs

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
@TestPropertySource(properties = {"myproperty = foo"}) 
public class TestWarSpringContext { 
    ...  
} 

を参照してください@TestPropertySource。

+1

このアノテーションはプロパティファイルパスもサポートしています。 – MigDus

+2

@TestPropertySource(properties = {"spring.cloud.config.label = feature/branch"})を使用してテスト中にSpring Cloud Config Clientのラベルを切り替えることができました –

+0

誠に申し訳ありませんが、悲しいことに、 Spring 4.2.9では、プロパティは常に空でした。静的ブロックのみが動作しました...アプリケーションのプロパティは処理しましたが、システムのプロパティは処理しませんでした。 – Gregor

4

一つは、システムのプロパティを初期化するために、テストApplicationContextInitializerを使用することができます。

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> 
{ 
    @Override 
    public void initialize(ConfigurableApplicationContext applicationContext) 
    { 
     System.setProperty("myproperty", "value"); 
    } 
} 

、その後、Springコンテキスト設定ファイルの場所に加えて、テストクラスでそれを設定します。

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SomeTest 
{ 
... 
} 

このすべての単体テストに対して特定のシステムプロパティを設定する必要がある場合は、双方向コードの重複を避けることができます。その後、この意志

MYPROPERTY=foo 

:次のようになります。

0

あなたの変数はすべてのテストのために有効にしたい場合は、あなたのテストのリソースディレクトリにapplication.propertiesファイルを持つことができます(src/test/resourcesデフォルト) @TestPropertySourceまたは同様の方法で定義されていない限り、ロードされ、使用されます。プロパティがロードされる正確な順序は、Springのドキュメントの章24. Externalized Configurationにあります。

関連する問題