web-dev-qa-db-ja.com

Junit TestでSpring-Bootのデフォルトのapplication.properties設定を上書きする

Spring-Bootアプリケーションを使って、デフォルトのプロパティをクラスパスのapplication.propertiesファイル(src/main/resources/application.properties)に設定しています。

JUnitテストのデフォルト設定をtest.propertiesファイル(src/test/resources/test.properties)で宣言されているプロパティでオーバーライドしたいです。

私はいつも私のJunitテスト用の専用の設定クラスを持っています。

package foo.bar.test;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

}

私は最初、TestConfigクラスで@PropertySource("classpath:test.properties")を使うことでうまくいくと思いましたが、これらのプロパティはapplication.properties設定を上書きしません(Spring-Boot Reference Doc - 23。外部化された設定 を参照)。

それから私はテストを呼び出すときに-Dspring.config.location=classpath:test.propertiesを使用しようとしました。それは成功しました - しかし私は各テスト実行のためにこのシステムプロパティを設定したくありません。したがって、私はそれをコードに入れました

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

  static {
    System.setProperty("spring.config.location", "classpath:test.properties");
  }

}

残念ながら、これもまた成功しませんでした。

JUnitテストでapplication.properties設定をtest.propertiesでオーバーライドする方法については、見落としがちだった簡単な解決策が必要です。

146
FrVaBe

@TestPropertySourceの値をオーバーライドするためにapplication.propertiesを使用することができます。そのJavadocから:

テストプロパティソースは、システムおよびアプリケーションのプロパティソースで定義されているプロパティを選択的に上書きするために使用できます。

例えば:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}
237
Andy Wilkinson

メタアノテーション を使って設定を外部化することもできます。例えば:

@RunWith(SpringJUnit4ClassRunner.class)
@DefaultTestAnnotations
public class ExampleApplicationTests { 
   ...
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public @interface DefaultTestAnnotations { }
56
Rob Winch

次のアノテーションが使用されている場合、Spring Bootは自動的にsrc/test/resources/application.propertiesをロードします。

@RunWith(SpringRunner.class)
@SpringBootTest

そのため、自動設定を利用するにはtest.propertiesapplication.propertiesに名前変更します。

プロパティファイルを(環境に)ロードする必要がある場合*のみ*ここで説明されているように、以下を使用することもできます

@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[更新:テストのために特定のプロパティを上書きする]

  1. src/main/resources/application-test.propertiesを追加してください。
  2. テストクラスに@ActiveProfiles("test")という注釈を付けます。

これはapplication.propertiesそしてapplication-test.propertiesプロパティをテストケースのアプリケーションコンテキストにロードします、ここで定義された規則 に従って

デモ - https://github.com/mohnish82/so​​-spring-boot-testprops

43
Mohnish

@SpringBootTest注釈を使用している場合、テストでいくつかのプロパティをオーバーライドするのに適した別のアプローチ:

@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})
6
NimaAJ

TLDR:

それで私がしたことは標準のsrc/main/resources/application.propertiesそしてまたsrc/test/resources/application-default.propertiesを持つことでした。ここで私はすべてのテストのためにいくつかの設定を上書きします。

全ストーリー

私は同じ問題に遭遇し、これまでプロファイルを使用していませんでした。今すぐやらなければならなくて、プロファイルを宣言することを覚えておくのは面倒なように思えました - それは簡単に忘れられることができます。

秘訣は、プロファイル固有のapplication-<profile>.propertiesが一般プロファイルの設定をオーバーライドすることを利用することです。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-を参照してください。プロファイル固有のプロパティ

4
elonderin

それ以外の場合は、デフォルトのプロパティコンフィギュレータ名を変更し、プロパティspring.config.name=testを設定してから、クラスパスリソースsrc/test/test.propertiesをネイティブクラスのorg.springframework.boot.SpringApplicationにすることで、アプリケーションプロパティを無視して自動設定されます。

利点:テストの自動設定

欠点:C.I.で "spring.config.name"プロパティを公開しています。層

ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config.name = application#設定ファイル名

1
D. Soloviev

JUnitsが書かれているsrc/test/resourcesにapplication.propertiesファイルを作成することもできます。

0
PragmaticFire