在 spring 引导单元测试中模拟实体管理器是一个好习惯吗
Is it a good practice to Mock entity manager in spring boot unit testing
我目前使用 spring 引导设计 API。在我的服务层,我使用 Entity Manager 来访问数据库。我在下面的服务层中提供了一个方法作为示例。
public Object getFirstReturnDate(Long vehicle_id, LocalDateTime reservation_date){
String string = "SELECT r.reservation_time from Reservation r left join fetch r.driverAssignment where r.reservation_time > :reservation_time " +
"and r.reserved_status.slug in ('pending','approved') and r.reserved_vehicle.id=:vehicle_id " +
" order by r.reservation_time asc ";
Query query = em.createQuery(string);
query.setParameter("reservation_time",reservation_date);
query.setParameter("vehicle_id",vehicle_id);
List<LocalDateTime> localDateTimes=query.getResultList();
if(localDateTimes.size()==0)
return new DefaultResponseDTO(200, ResponseStatus.OK,"Any Date",null);;
return new DefaultResponseDTO(200, ResponseStatus.OK,"Possible Time",localDateTimes.get(0));
}
在测试单元中,我嘲笑实体管理器如下,
@Mock
EntityManager em;
并且在测试方法中,
Query query = Mockito.mock(Query.class);
Mockito.when(em.createQuery(Mockito.anyString())).thenReturn(query);
Mockito.when(query.getResultList()).thenReturn(new LinkedList());
我的问题是,如果我像上面提到的那样模拟实体管理器,那么方法中的查询就不会被检查。这是一种糟糕的编码习惯吗?
有没有其他不调用数据库就可以检查查询的方法?
任何测试方法都应该是综合测试策略的一部分。 IE。您应该知道您希望单元测试找到哪些类型的错误,您希望集成和 E2E 测试找到哪些类型的错误,等等。
模拟 EntityManager 有优点:
- 更容易孤立地测试您的业务逻辑
- 您可以轻松设置假设场景
- 您的测试会更快,因为您没有建立与数据库的连接
但也有缺点:
- 您没有测试您的数据库连接和配置
所以问题是,如果数据库集成问题没有在这个测试中检查,你在哪里测试?一旦你知道了那个问题的答案,你就会知道你上面问的那个问题的答案。
我建议您查看“Testing Strategies in a Microservice Architecture”以更深入地了解如何进行测试。
我目前使用 spring 引导设计 API。在我的服务层,我使用 Entity Manager 来访问数据库。我在下面的服务层中提供了一个方法作为示例。
public Object getFirstReturnDate(Long vehicle_id, LocalDateTime reservation_date){
String string = "SELECT r.reservation_time from Reservation r left join fetch r.driverAssignment where r.reservation_time > :reservation_time " +
"and r.reserved_status.slug in ('pending','approved') and r.reserved_vehicle.id=:vehicle_id " +
" order by r.reservation_time asc ";
Query query = em.createQuery(string);
query.setParameter("reservation_time",reservation_date);
query.setParameter("vehicle_id",vehicle_id);
List<LocalDateTime> localDateTimes=query.getResultList();
if(localDateTimes.size()==0)
return new DefaultResponseDTO(200, ResponseStatus.OK,"Any Date",null);;
return new DefaultResponseDTO(200, ResponseStatus.OK,"Possible Time",localDateTimes.get(0));
}
在测试单元中,我嘲笑实体管理器如下,
@Mock
EntityManager em;
并且在测试方法中,
Query query = Mockito.mock(Query.class);
Mockito.when(em.createQuery(Mockito.anyString())).thenReturn(query);
Mockito.when(query.getResultList()).thenReturn(new LinkedList());
我的问题是,如果我像上面提到的那样模拟实体管理器,那么方法中的查询就不会被检查。这是一种糟糕的编码习惯吗?
有没有其他不调用数据库就可以检查查询的方法?
任何测试方法都应该是综合测试策略的一部分。 IE。您应该知道您希望单元测试找到哪些类型的错误,您希望集成和 E2E 测试找到哪些类型的错误,等等。
模拟 EntityManager 有优点:
- 更容易孤立地测试您的业务逻辑
- 您可以轻松设置假设场景
- 您的测试会更快,因为您没有建立与数据库的连接
但也有缺点:
- 您没有测试您的数据库连接和配置
所以问题是,如果数据库集成问题没有在这个测试中检查,你在哪里测试?一旦你知道了那个问题的答案,你就会知道你上面问的那个问题的答案。
我建议您查看“Testing Strategies in a Microservice Architecture”以更深入地了解如何进行测试。