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@Testcontainersclass OrderServiceIntegrationTest {@Containerstatic GenericContainer<?> redis = new GenericContainer<>("redis:7-alpine").withExposedPorts(6379);@DynamicPropertySourcestatic 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.