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
でオーバーライドする方法については、見落としがちだった簡単な解決策が必要です。
@TestPropertySource
の値をオーバーライドするためにapplication.properties
を使用することができます。そのJavadocから:
テストプロパティソースは、システムおよびアプリケーションのプロパティソースで定義されているプロパティを選択的に上書きするために使用できます。
例えば:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {
}
メタアノテーション を使って設定を外部化することもできます。例えば:
@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 { }
次のアノテーションが使用されている場合、Spring Bootは自動的にsrc/test/resources/application.properties
をロードします。
@RunWith(SpringRunner.class)
@SpringBootTest
そのため、自動設定を利用するにはtest.properties
をapplication.properties
に名前変更します。
プロパティファイルを(環境に)ロードする必要がある場合*のみ*ここで説明されているように、以下を使用することもできます
@RunWith(SpringRunner.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
[更新:テストのために特定のプロパティを上書きする]
src/main/resources/application-test.properties
を追加してください。@ActiveProfiles("test")
という注釈を付けます。これはapplication.properties
とそしてapplication-test.properties
プロパティをテストケースのアプリケーションコンテキストにロードします、ここで定義された規則 に従って 。
デモ - https://github.com/mohnish82/so-spring-boot-testprops
@SpringBootTest
注釈を使用している場合、テストでいくつかのプロパティをオーバーライドするのに適した別のアプローチ:
@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})
それで私がしたことは標準の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-を参照してください。プロファイル固有のプロパティ 。
それ以外の場合は、デフォルトのプロパティコンフィギュレータ名を変更し、プロパティ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#設定ファイル名
JUnitsが書かれているsrc/test/resourcesにapplication.propertiesファイルを作成することもできます。