在 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”以更深入地了解如何进行测试。