アノテーションインターフェース DynamicPropertySource
@DynamicPropertySource は、動的な値を持つプロパティを Environment の PropertySources のセットに追加するために、統合テストクラスの静的メソッドに適用できるアノテーションです。 あるいは、テストの ApplicationContext 内の特別な Bean によって、動的プロパティを Environment に追加することもできます。詳細については、DynamicPropertyRegistrar を参照してください。
このアノテーションとそのサポートインフラストラクチャは、もともと Testcontainers ベースのテストのプロパティを Spring 統合テストに簡単に公開できるようにするために設計されました。ただし、この機能は、テストの ApplicationContext の外部でライフサイクルが管理される任意の形式の外部リソースで使用できます。
@DynamicPropertySource メソッドは、DynamicPropertyRegistry を使用して、Environment の PropertySources のセットに名前と値のペアを追加します。値は動的であり、プロパティが解決されたときにのみ呼び出される SupplierSE を介して提供されます。通常、以下の例のように、メソッド参照を使用して値を指定します。
@DynamicPropertySource でアノテーションが付けられた統合テストクラス内のメソッドは、static である必要があり、単一の DynamicPropertyRegistry 引数を受け入れる必要があります。
@DynamicPropertySource でアノテーションが付けられたメソッドの動的プロパティは、スーパークラスやインターフェースからの継承と同様に、囲んでいるテストクラスから継承されます。詳細については、@NestedTestConfiguration を参照してください。
注意 : 基本クラスで @DynamicPropertySource を使用し、動的プロパティがサブクラス間で変更されるためにサブクラスでのテストが失敗することがわかった場合、各サブクラスが正しい動的プロパティを持つ独自の ApplicationContext を取得するように、基本クラスに @DirtiesContext のアノテーションを付ける必要があります。
優先順位
動的プロパティは、@TestPropertySource から読み込まれたプロパティ、オペレーティングシステムの環境、Java システムプロパティ、アプリケーションによって宣言的に @PropertySource を使用して、またはプログラムで追加されたプロパティソースよりも優先されます。動的プロパティを使用して、@TestPropertySource、システムプロパティソース、アプリケーションプロパティソースを介してロードされたプロパティを選択的にオーバーライドできます。
サンプル
次の例は、統合テストクラスで @DynamicPropertySource を使用する方法を示しています。ApplicationContext 内の Bean は、Redis コンテナーから動的に取得される redis.host および redis.port プロパティにアクセスできます。
@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);
}
}- 導入:
- 5.2.5
- 作成者:
- Phillip Webb, Sam Brannen
- 関連事項: