動的プロパティソースを使用したコンテキスト構成
Spring Framework 5.2.5 以降、TestContext フレームワークは、@DynamicPropertySource
アノテーションを介して動的プロパティのサポートを提供します。このアノテーションは、統合テスト用にロードされた ApplicationContext
の Environment
内の PropertySources
のセットに動的な値を持つプロパティを追加する必要がある統合テストで使用できます。
|
クラスレベルで適用される @TestPropertySource
アノテーションとは対照的に、@DynamicPropertySource
は、Environment
に名前と値のペアを追加するために使用される単一の DynamicPropertyRegistry
引数を受け入れる static
メソッドに適用される必要があります。値は動的であり、プロパティが解決されたときにのみ呼び出される Supplier
を介して提供されます。通常、メソッド参照は値を提供するために使用されます。次の例では、Testcontainers プロジェクトを使用して Spring ApplicationContext
外の Redis コンテナーを管理しています。管理された Redis コンテナーの IP アドレスとポートは、redis.host
および redis.port
プロパティを介して、テストの ApplicationContext
内のコンポーネントで利用できるようになります。これらのプロパティは、Spring の Environment
抽象化を介してアクセスするか、たとえば、それぞれ @Value("${redis.host}")
および @Value("${redis.port}")
を介して、Spring 管理のコンポーネントに直接注入できます。
基本クラスで |
Java
Kotlin
@SpringJUnitConfig(/* ... */)
@Testcontainers
class ExampleIntegrationTests {
@Container
static GenericContainer redis =
new GenericContainer("redis:5.0.3-alpine").withExposedPorts(6379);
@DynamicPropertySource
static void redisProperties(DynamicPropertyRegistry registry) {
registry.add("redis.host", redis::getHost);
registry.add("redis.port", redis::getFirstMappedPort);
}
// tests ...
}
@SpringJUnitConfig(/* ... */)
@Testcontainers
class ExampleIntegrationTests {
companion object {
@Container
@JvmStatic
val redis: GenericContainer =
GenericContainer("redis:5.0.3-alpine").withExposedPorts(6379)
@DynamicPropertySource
@JvmStatic
fun redisProperties(registry: DynamicPropertyRegistry) {
registry.add("redis.host", redis::getHost)
registry.add("redis.port", redis::getFirstMappedPort)
}
}
// tests ...
}