Annotation Interface DynamicPropertySource
@DynamicPropertySource is an annotation that can be applied to static
 methods in integration test classes or to @Bean methods in test
 @Configuration classes in order to add properties with dynamic values
 to the Environment's set of PropertySources.
 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 or with beans whose lifecycle is managed by
 the test's ApplicationContext.
 
@DynamicPropertySource-annotated 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.
 
@Bean methods annotated with @DynamicPropertySource may
 either accept an argument of type DynamicPropertyRegistry or access a
 DynamicPropertyRegistry instance autowired into their enclosing
 @Configuration class. Note, however, that @Bean methods which
 interact with a DynamicPropertyRegistry are not required to be annotated
 with @DynamicPropertySource unless they need to enforce eager
 initialization of the bean within the context.
 See DynamicPropertyRegistry for details.
 
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);
     }
 }
 The following example demonstrates how to use @DynamicPropertySource
 with a @Bean method. Beans in the ApplicationContext can
 access the api.url property which is dynamically retrieved from the
 ApiServer bean.
 
 @Configuration
 class TestConfig {
     @Bean
     @DynamicPropertySource
     ApiServer apiServer(DynamicPropertyRegistry registry) {
         ApiServer apiServer = new ApiServer();
         registry.add("api.url", apiServer::getUrl);
         return apiServer;
     }
 }- Since:
- 5.2.5
- Author:
- Phillip Webb, Sam Brannen
- See Also: