112

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

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

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

4

9 に答える 9

143

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

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

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

}

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

于 2012-08-27T14:48:17.100 に答える
103

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

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

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

于 2016-03-03T04:45:23.107 に答える
17

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

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

于 2016-12-23T17:21:31.140 に答える
15

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

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"));
   }
 }
于 2019-04-09T22:18:11.387 に答える
7

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

MYPROPERTY=foo

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

于 2018-03-02T10:59:57.590 に答える
3

システムプロパティを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)次の手順を実行します。

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

于 2018-09-03T09:57:34.243 に答える
3

単体テストの場合、アプリケーションを実行しているサーバーがないため、「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>
于 2019-04-26T23:31:19.220 に答える
2

springbootの場合、これを行う最も簡単な方法は@SpringBootTest、Javaで使用できるアノテーションを使用することです。

@SpringBootTest(
    properties = { "spring.application.name=example", "ENV_VARIABLE=secret" }
)
public class ApplicationTest {

    // Write your tests here

}

または、kotlinでは次のことができます。

@SpringBootTest(
    properties = ["spring.application.name=example", "ENV_VARIABLE=secret"]
)
internal class ApplicationKTest {

    // Write your tests here

}

これで、アノテーションで定義したプロパティでプロパティをオーバーライドしてテストを実行する必要があります。application.ymlあなたがそのように見えたとしましょう:

spring:
  application:
    name: "app"

db:
  username: "user"
  password: ${ENV_VARIABLE:default}

次に、テスト中に次のようになります。

  • springプロパティspring.application.nameは値を返します"example"
  • 環境変数ENV_VARIABLEはを返すので、コードで"secret"値を使用すると、が返されます。db.password"secret"
于 2021-09-16T16:10:19.223 に答える
1

多くのテストクラス(tomcat / serverを起動するITテスト)があり、テストが失敗する場合は、System.setProperty( "ccm.configs.dir"、configPath);を使用してシステムプロパティを設定する必要があります。春が始まる前にそれが設定されていることを確認する必要があるため、クラスの静的コンテキストに配置する必要があります。また、それに依存する可能性のあるテストがこの設定されたシステムプロパティを取得することを確認するには、その変数を設定するテストフォルダーで単純な構成クラスを定義します。PS私の場合、必要な環境変数は「ccm.configs.dir」でした。これがテストフォルダーに追加したものです。

@Configuration
public class ConfigLoader {
  static {
    
    System.setProperty("ccm.configs.dir", "path/to/the/resource");
  }

}

そして、私のすべての統合テストクラスは、実行されるまでにその変数がすでに設定されていることを取得できました。

于 2021-11-19T23:05:12.840 に答える