在 Spring 引导中进行单元测试时使用实体管理器检查创建的查询
Check created queries with Entity Manager when unit testing in Spring Boot
我目前正在使用 springboot 构建一个 API。在我的服务层中,我使用实体管理器来创建查询。例如,
public Object editFeedback(Long user_id, Long reservation_id, String feedback){
String s = "select r from Reservation r left join fetch r.driverAssignment where r.id=:id and r.reservation_done_by.id=:user_id ";
List<Reservation> reservations = em.createQuery(s).setParameter("id", reservation_id).setParameter("user_id", user_id).getResultList();
if (reservations.size() == 0)
return new DefaultResponseDTO(201, ResponseStatus.INVALID_INPUTS, "Wrong reservation id");
Reservation reservation = reservations.get(0);
reservation.setFeedback(feedback);
reservationRepository.save(reservation);
return new DefaultResponseDTO(200, ResponseStatus.OK, "Successfully done");
}
我的问题是,在为服务层中的方法编写单元测试时,如何在不影响或从原始数据库获取数据的情况下检查这些查询是否正常工作?
有关其他详细信息,如果我从原始数据库中获取数据来检查查询,那么输出会不时发生变化。所以,我必须嘲笑实体经理。那么查询就不会被检查。
Query query = Mockito.mock(Query.class);
Mockito.when(em.createQuery(Mockito.anyString())).thenReturn(query);
Mockito.when(query.getResultList()).thenReturn(sampleReservations.getReservationsForUserReservations());
是否有任何正确的方法来使用模拟实体管理器检查查询是否正常工作?或者如果我对单元测试的理解有误或者有什么建议?
在服务层测试中,您应该模拟存储库并阻止任何数据库访问。在这样的测试中,您通常更关心服务本身。这也使得测试原本更难测试的场景(例如数据库故障)变得更容易。
要测试您的查询,您应该使用服务层或直接使用存储库进行单独的集成测试,并为数据库使用测试容器 (https://www.testcontainers.org/)。
我目前正在使用 springboot 构建一个 API。在我的服务层中,我使用实体管理器来创建查询。例如,
public Object editFeedback(Long user_id, Long reservation_id, String feedback){
String s = "select r from Reservation r left join fetch r.driverAssignment where r.id=:id and r.reservation_done_by.id=:user_id ";
List<Reservation> reservations = em.createQuery(s).setParameter("id", reservation_id).setParameter("user_id", user_id).getResultList();
if (reservations.size() == 0)
return new DefaultResponseDTO(201, ResponseStatus.INVALID_INPUTS, "Wrong reservation id");
Reservation reservation = reservations.get(0);
reservation.setFeedback(feedback);
reservationRepository.save(reservation);
return new DefaultResponseDTO(200, ResponseStatus.OK, "Successfully done");
}
我的问题是,在为服务层中的方法编写单元测试时,如何在不影响或从原始数据库获取数据的情况下检查这些查询是否正常工作?
有关其他详细信息,如果我从原始数据库中获取数据来检查查询,那么输出会不时发生变化。所以,我必须嘲笑实体经理。那么查询就不会被检查。
Query query = Mockito.mock(Query.class);
Mockito.when(em.createQuery(Mockito.anyString())).thenReturn(query);
Mockito.when(query.getResultList()).thenReturn(sampleReservations.getReservationsForUserReservations());
是否有任何正确的方法来使用模拟实体管理器检查查询是否正常工作?或者如果我对单元测试的理解有误或者有什么建议?
在服务层测试中,您应该模拟存储库并阻止任何数据库访问。在这样的测试中,您通常更关心服务本身。这也使得测试原本更难测试的场景(例如数据库故障)变得更容易。
要测试您的查询,您应该使用服务层或直接使用存储库进行单独的集成测试,并为数据库使用测试容器 (https://www.testcontainers.org/)。