0 Tage Serie
java / expert
Snippet

Dynamische Eigenschaftsinjektion in Spring-Integrationstests

In modernen Spring Boot-Integrationstests können dynamische Infrastruktur-Ports (wie zufällig zugewiesene Docker-Container-Ports über Testcontainers) nicht zur Kompilierzeit bekannt sein oder in statischen Konfigurationsdateien deklariert werden. Die Verwendung von `@DynamicPropertySource` ermöglicht es Experten, dynamische Laufzeiteigenschaften vor der Initialisierung des `ApplicationContext` in die Spring-`Environment` einzuspeisen.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootTest
@Testcontainers
class OrderServiceIntegrationTest {
@Container
static GenericContainer<?> redis = new GenericContainer<>("redis:7-alpine").withExposedPorts(6379);
@DynamicPropertySource
static void registerRedisProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.redis.host", redis::getHost);
registry.add("spring.data.redis.port", () -> redis.getMappedPort(6379));
}
}
spring
Erklärung
1
@SpringBootTest
Lädt den vollständigen Spring-Anwendungskontext für Integrationstests.
2
@DynamicPropertySource
Annotiert eine statische Methode zur Registrierung dynamischer Eigenschaftswerte in der Spring-Environment.
3
registry.add("spring.data.redis.host", redis::getHost);
Registriert eine Supplier-Funktion, die den Container-Hostnamen zur Laufzeit dynamisch bereitstellt.
4
registry.add("spring.data.redis.port", () -> redis.getMappedPort(6379));
Registriert einen Supplier, der den zufällig gemappten Host-Port für Redis bei der Bean-Initialisierung auflöst.