アノテーションインターフェース DynamicPropertySource
@DynamicPropertySource
は、動的な値を持つプロパティを Environment
の PropertySources
のセットに追加するために、統合テストクラスの静的メソッドに適用できるアノテーションです。 あるいは、テストの ApplicationContext
内の特別な Bean によって、動的プロパティを Environment
に追加することもできます。詳細については、DynamicPropertyRegistrar
を参照してください。
このアノテーションとそのサポートインフラストラクチャは、もともと Testcontainers ベースのテストのプロパティを Spring 統合テストに簡単に公開できるようにするために設計されました。ただし、この機能は、テストの ApplicationContext
の外部でライフサイクルが管理される任意の形式の外部リソースで使用できます。
@DynamicPropertySource
メソッドは、DynamicPropertyRegistry
を使用して、Environment
の PropertySources
のセットに名前と値のペアを追加します。値は動的であり、プロパティが解決されたときにのみ呼び出される Supplier
SE を介して提供されます。通常、以下の例のように、メソッド参照を使用して値を指定します。
@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
- 関連事項: