java / intermediate
Snippet
Repository-Abfragen mit @DataJpaTest und DynamicPropertyRegistry testen
@DataJpaTest deaktiviert das vollständige Komponenten-Scanning und konzentriert sich ausschließlich auf JPA-Repositories, was den Test-Overhead reduziert. In Kombination mit Testcontainers und @DynamicPropertySource ermöglicht dies Integrationstests gegen eine echte Datenbankinstanz statt eines In-Memory-Ersatzes.
snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@DataJpaTest@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)@Testcontainersclass OrderRepositoryTests {@Containerstatic PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine");@DynamicPropertySourcestatic void configureProperties(DynamicPropertyRegistry registry) {registry.add("spring.datasource.url", postgres::getJdbcUrl);registry.add("spring.datasource.username", postgres::getUsername);registry.add("spring.datasource.password", postgres::getPassword);}@Autowiredprivate OrderRepository orderRepository;@Testvoid shouldFindOrdersByCustomerId() {orderRepository.save(new OrderEntity("cust-101", new BigDecimal("49.99")));List<OrderEntity> orders = orderRepository.findByCustomerId("cust-101");assertThat(orders).hasSize(1);}}
spring
Erklärung
1
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
Verhindert, dass Spring Boot die konfigurierte DataSource durch eine eingebettete In-Memory-Datenbank wie H2 ersetzt.
2
@DynamicPropertySource
Registriert dynamische Eigenschaftswerte aus dem laufenden Container in der Spring Environment vor der Testausführung.
3
registry.add("spring.datasource.url", postgres::getJdbcUrl);
Übergibt die dynamische JDBC-URL des aktiven Containers an die Spring-DataSource.