繁体   English   中英

Mockito for Spring JPA 规范 API 完全不执行动态查询

[英]Mockito for Spring JPA Specifiction API does not execute the dynamic query entirely

我有以下带有动态查询的服务 class。

public class CarService {

    public Page<Cars> getAllCars(CarRequest request, ,, String carCarrier, String carNumber,Pageable pageRequest){
       String userCarrier = request.getSubCarrier();
       Specification <Car> carSpecification = null;
       carSpecification = getCarDetails(request, carCarrier, carNumber);
       return carRepository.findAll(carSpecification, pageRequest);
   }

    public Specification<Car> getCarDetails(CarRequest request, String carCarrier, String carNumber) {
        System.out.println("I am in query");
        return (Root<Car> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
            System.out.println("I am executing query");
            List<Predicate> predicates = new ArrayList<>();
            if(StringUtils.isNotBlank(request.getCarColor())) {
                predicates.add(cb.and(cb.equal(root.get(“carColor”), request.getCarColor())));
            }

            if(StringUtils.isNotBlank(carCarrier)) {
                predicates.add(cb.and(root.get("carCarrier”),carCarrier)));
            }

            if(StringUtils.isNotBlank(carNumber)) {
                predicates.add(cb.and(cb.equal(root.get("carNumber"), carNumber)));

            }
            return cb.and(predicates.toArray(new Predicate[predicates.size()]));

        };
    }
}

下面是我正在尝试测试动态查询的测试 class。

public class CarServiceTest {
@Mock
private CarService carService;

@Test
public void test_cars() {
    Pageable pageRequest = new PageRequest(0,20);
    CarRequest request = new CarRequest();
    request.setCarColor(“Red”);
    request.setCarMake(“Nissan”);
    when(carRepository.findAll(Mockito.any(Specification.class), Mockito.eq(pageRequest)))
            .thenReturn(Mockito.mock(Page.class));

    Assert.assertNotNull(carService.getAllCars(request, pageRequest));

    }

}

上面的测试用例有效,但它只是输入 getCarDetails 并打印第一行“我在查询中”并返回。 它不会进一步检查查询中的条件子句。

我也尝试直接从测试 class 调用该方法

carService.getCarDetails(carRequest. "ABC", “A123”);

结果还是一样。 我最近开始使用 Mockito 所以我不确定我是否在这里遗漏了导致这种行为的东西。

我如何确保从代码覆盖率的角度执行所有行。

Specification是功能接口,您返回 function 将由 spring 在后台调用(在您将其传递给合适的存储库方法之后)。 在测试中,您模拟该存储库方法,因此没有机会执行返回的 function。

Specification情况下,此 function 被称为toPredicate()

https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/domain/Specification.java#L104

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM