Annotation Interface DynamicPropertySource


@Target(METHOD) @Retention(RUNTIME) @Documented public @interface DynamicPropertySource
@DynamicPropertySource is an annotation that can be applied to static methods in integration test classes in order to add properties with dynamic values to the Environment's set of PropertySources.

Alternatively, dynamic properties can be added to the Environment by special beans in the test's ApplicationContext. See DynamicPropertyRegistrar for details.

This annotation and its supporting infrastructure were originally designed to allow properties from Testcontainers based tests to be exposed easily to Spring integration tests. However, this feature may be used with any form of external resource whose lifecycle is managed outside the test's ApplicationContext.

@DynamicPropertySource methods use a DynamicPropertyRegistry to add name-value pairs to the Environment's set of PropertySources. 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 in the example below.

Methods in integration test classes that are annotated with @DynamicPropertySource must be static and must accept a single DynamicPropertyRegistry argument.

Dynamic properties from methods annotated with @DynamicPropertySource will be inherited from enclosing test classes, analogous to inheritance from superclasses and interfaces. See @NestedTestConfiguration for details.

NOTE: if you use @DynamicPropertySource in a base class and discover that tests in subclasses fail because the dynamic properties change between subclasses, you may need to annotate your base class with @DirtiesContext to ensure that each subclass gets its own ApplicationContext with the correct dynamic properties.

Precedence

Dynamic properties have higher precedence than those loaded from @TestPropertySource, the operating system's environment, Java system properties, or property sources added by the application declaratively by using @PropertySource or programmatically. Thus, dynamic properties can be used to selectively override properties loaded via @TestPropertySource, system property sources, and application property sources.

Examples

The following example demonstrates how to use @DynamicPropertySource in an integration test class. Beans in the ApplicationContext can access the redis.host and redis.port properties which are dynamically retrieved from the Redis container.

 @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);
     }
 }
Since:
5.2.5
Author:
Phillip Webb, Sam Brannen
See Also: