【问题标题】:Check created queries with Entity Manager when unit testing in Spring Boot在 Spring Boot 中进行单元测试时使用 Entity Manager 检查创建的查询
【发布时间】:2021-11-22 11:25:15
【问题描述】:

我目前正在使用 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());

是否有任何适当的方法可以使用模拟实体管理器检查查询是否正常工作?或者如果我错误地理解了单元测试或任何其他建议?

【问题讨论】:

    标签: java spring-boot unit-testing mocking entitymanager


    【解决方案1】:

    在服务层测试中,您应该模拟存储库并阻止任何数据库访问。在这样的测试中,您通常更关心服务本身。这也使得测试原本难以测试的场景(例如数据库故障)变得更加容易。

    要测试您的查询,您应该使用服务层或直接使用存储库进行单独的集成测试,并为数据库使用测试容器 (https://www.testcontainers.org/)。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 2015-03-23
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多