0 Tage Serie
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)
@Testcontainers
class OrderRepositoryTests {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine");
@DynamicPropertySource
static 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);
}
@Autowired
private OrderRepository orderRepository;
@Test
void 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.