web-dev-qa-db-ja.com

春のテストで環境変数またはシステムプロパティを設定するにはどうすればよいですか?

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

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

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

79

静的イニシャライザでシステムプロパティを初期化できます。

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

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

}

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

105
Jimmy Praet

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

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

Spring docs および Javadocs の@TestPropertySourceを参照してください。

73
Raman

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

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

7
anre

システムプロパティを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セクションでテストクラスを選択します。

3)以下を実行します。

enter image description here

2

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

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

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

MYPROPERTY=foo

@TestPropertySourceまたは同様の方法で定義がない限り、これはロードされて使用されます。プロパティがロードされる正確な順序は、Springのドキュメントの章で見つけることができます 24。外部設定

1
blalasaadri

単体テストの場合、アプリケーションを実行しているサーバーがないため、「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>
0
Gene