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 {@Autowiredprivate TestEntityManager entityManager;@Autowiredprivate OrderRepository orderRepository;@Testvoid 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.