0 Tage Serie
java / intermediate
Snippet

Isolierung von Repository-Persistenz-Slices mit TestEntityManager

@DataJpaTest konfiguriert ein isoliertes Test-Slice, das sich ausschließlich auf JPA-Komponenten konzentriert, ohne den vollständigen Webserver oder Geschäftsdienste zu laden. TestEntityManager ist eine speziell für Tests entwickelte Alternative zum Standard-JPA-EntityManager. Er ermöglicht das explizite Persistieren, Leeren und Löschen des Persistenzkontexts, sodass Abfragen des Repositories tatsächlich die Datenbank abfragen und nicht aus dem First-Level-Cache bedient werden.

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
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class OrderRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private OrderRepository orderRepository;
@Test
void shouldFindActiveOrdersByCustomerCode() {
Customer customer = entityManager.persistFlushFind(new Customer("CUST_100"));
Order order = new Order("ORD_99", OrderStatus.ACTIVE, customer);
entityManager.persistAndFlush(order);
entityManager.clear();
List<Order> activeOrders = orderRepository.findByCustomerCodeAndStatus("CUST_100", OrderStatus.ACTIVE);
assertThat(activeOrders).hasSize(1);
assertThat(activeOrders.get(0).getOrderNumber()).isEqualTo("ORD_99");
}
}
spring
Erklärung
1
@DataJpaTest
Startet ausschließlich Spring Data JPA Repositories, Entitäten und DataSource-Beans für effiziente Integrationstests.
2
Customer customer = entityManager.persistFlushFind(new Customer("CUST_100"));
Persistiert eine Entität, führt Änderungen sofort auf der Datenbank aus (flush) und gibt die verwaltete Instanz zurück.
3
entityManager.clear();
Leert den First-Level-Cache von Hibernate, um sicherzustellen, dass nachfolgende Repository-Aufrufe echte SQL-Abfragen testen.