春のテストで環境変数またはシステムプロパティを設定する方法


93

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

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

アノテーションを使用してアプリケーションコンテキストを構成すると、Springコンテキストが初期化される前に何かを実行できるフックが表示されません。

回答:


127

静的初期化子でSystemプロパティを初期化できます。

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

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

}

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


14
愚かな私-OK、それはうまくいくでしょう。さらに良い:おそらく@BeforeClass、システムプロパティを設定する@AfterClassメソッドとそれを削除するメソッドも機能し、それ自体をきれいにクリーンアップします。(ただし、試してみませんでした。)
Hans-PeterStörr、

1
@BeforeClassを試してみました-テストインスタンスで他のプロパティが設定される前にシステムプロパティを設定するのに
うまくいきました

これをありがとう。静的なものは機能しませんでしたが、@ BeforeClassを使用した小さなメソッドが機能しました。
Midhun Agnihotram 2016

このメカニズムは、Log4j2構成ファイルのプロパティを変更すると機能しません。とにかく、その静的なコードの前に、Springが読み込まれている(したがって、ログが正しく記録されていない)ようです。
lucasvc

86

これを行う正しい方法は、Spring 4.1以降、@TestPropertySourceアノテーションを使用することです。

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

で@TestPropertySourceを参照してください春のドキュメントのJavadoc


2
この注釈は、プロパティファイルのパスもサポートしています。
MigDus

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

4
良い答えですが、残念ながらうまくいきませんでした。Spring4.2.9を使用すると、プロパティは常に空でした。静的ブロックのみが機能しました...アプリケーションプロパティでは機能しましたが、システムプロパティでは機能しませんでした。
グレゴール

最初に静的バージョン(これは機能しました)を見て試してみましたが、このAnnotationはさらにすっきりとしていて、はるかに望ましいです(私にとっては、魅力のようにも機能するため)。
BAERUS、2018年

3
これは、Environment「環境変数」とは異なるプロパティを提供します。
OrangeDog

11

テスト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
{
...
}

これにより、すべての単体テストに対して特定のシステムプロパティを設定する必要がある場合に、コードの重複を回避できます。


これは、Spring Boot 2.xおよびJunit 5.x(@SpringBootTestまたはテストスライスアノテーションのいずれかを使用)でも完全に機能します
Wim Deblauwe

9

ここでのすべての回答は現在、設定がより複雑な環境変数とは異なるシステムプロパティについてのみ述べています。テスト用。ありがたいことに、以下のクラスはそのために使用でき、クラスのドキュメントには良い例があります

EnvironmentVariables.html

ドキュメントからの簡単な例、@ SpringBootTestで動作するように変更

@SpringBootTest
public class EnvironmentVariablesTest {
   @ClassRule
   public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");

   @Test
   public void test() {
     assertEquals("value", System.getenv("name"));
   }
 }

EnvironmentVariablesルールはサードパーティライブラリの一部であり、ハッキーリフレクションを使用して、JVMメモリ内の環境のキャッシュ値を変更し、実際の環境変数さえも変更しません。だから、私はそれを使いたくない、または誰かにそうすることを勧めたくない。
クリスチャン

4

変数をすべてのテストで有効にする場合は、次のようなapplication.propertiesファイルをテストリソースディレクトリ(デフォルトsrc/test/resourcesでは)に置くことができます。

MYPROPERTY=foo

これは、@TestPropertySourceまたは同様の方法による定義がない限り、読み込まれて使用されます。プロパティが読み込まれる正確な順序は、Springのドキュメントの第24章「外部化された構成」に記載されています。


2

システムプロパティをVM引数として設定できます。

プロジェクトがMavenプロジェクトの場合、テストクラスの実行中に次のコマンドを実行できます。

mvn test -Dapp.url="https://stackoverflow.com"

テストクラス:

public class AppTest  {
@Test
public void testUrl() {
    System.out.println(System.getProperty("app.url"));
    }
}

個別のテストクラスまたはメソッドをEclipseで実行する場合:

1)[実行]-> [実行構成]に移動します

2)左側のJunitセクションでTestクラスを選択します。

3)以下を実行します。

ここに画像の説明を入力してください


1

単体テストの場合、アプリケーションを実行しているサーバーがないため、「mvn clean install」を実行しても、システム変数はまだインスタンス化されていません。したがって、システムプロパティを設定するには、pom.xmlで設定する必要があります。そのようです:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <systemPropertyVariables>
            <propertyName>propertyValue</propertyName>
            <MY_ENV_VAR>newValue</MY_ENV_VAR>
            <ENV_TARGET>olqa</ENV_TARGET>
            <buildDirectory>${project.build.directory}</buildDirectory>
        </systemPropertyVariables>
    </configuration>
</plugin>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.