diff --git a/src/docs/asciidoc/testing.adoc b/src/docs/asciidoc/testing.adoc index b54635d8c4..c8cc246ab6 100644 --- a/src/docs/asciidoc/testing.adoc +++ b/src/docs/asciidoc/testing.adoc @@ -3947,7 +3947,6 @@ to define properties in both a subclass and its superclass by using inline prope // ... } ---- - [source,kotlin,indent=0,subs="verbatim,quotes",role="secondary"] .Kotlin ---- @@ -3964,6 +3963,54 @@ to define properties in both a subclass and its superclass by using inline prope } ---- +[[testcontext-ctx-management-dynamic-property-sources]] +===== Context Configuration with Dynamic Property Sources + +As of Spring Framework 5.2.5, the TestContext framework provides support for _dynamic_ +property sources via the `@DynamicPropertySource` annotation. This annotation can be used +in integration tests that need to add properties with dynamic values to the set of +`PropertySources` in the `Environment` for the `ApplicationContext` loaded for the +integration test. + +NOTE: The `@DynamicPropertySource` annotation and its supporting infrastructure were +originally designed to allow properties from +https://www.testcontainers.org/[Testcontainers] based tests to be exposed easily to +Spring integration tests. However, this feature may also be used with any form of +external resource whose lifecycle is maintained outside the test's `ApplicationContext`. + +In contrast to the <> +annotation that is applied at the class level, `@DynamicPropertySource` must be applied +to a `static` method that accepts a single `DynamicPropertyRegistry` argument which is +used to add _name-value_ pairs to the `Environment`. Values are dynamic and provided via +a `Supplier` which is only invoked when the property is resolved. Typically, method +references are used to supply values, as can be seen in the following example which uses +the Testcontainers project to manage a Redis container outside of the Spring +`ApplicationContext`. The IP address and port of the managed Redis container are made +available to components within the test's `ApplicationContext` via the `redis.host` and +`redis.port` properties. These properties can be injected into Spring-managed components +via `@Value("${redis.host}")` and `@Value("${redis.port}")`, respectively. + +[source,java,indent=0,subs="verbatim,quotes",role="primary"] +.Java +---- + @SpringJUnitConfig(/* ... */) + @Testcontainers + class ExampleIntegrationTests { + + @Container + static RedisContainer redis = new RedisContainer(); + + @DynamicPropertySource + static void redisProperties(DynamicPropertyRegistry registry) { + registry.add("redis.host", redis::getContainerIpAddress); + registry.add("redis.port", redis::getMappedPort); + } + + // tests ... + + } +---- + [[testcontext-ctx-management-web]] ===== Loading a `WebApplicationContext`