@Target(value=METHOD) @Retention(value=RUNTIME) @Documented public @interface DynamicPropertySource
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 also be
used with any form of external resource whose lifecycle is maintained outside
the test's ApplicationContext
.
Methods annotated with @DynamicPropertySource
must be static
and must have a single DynamicPropertyRegistry
argument which is used
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.
As of Spring Framework 5.3.2, 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.
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.
@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); } }
DynamicPropertyRegistry
,
ContextConfiguration
,
TestPropertySource
,
PropertySource
,
DirtiesContext