Спецификация Mockito для Spring JPA Specification не выполняет динамический запрос полностью - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть следующий класс обслуживания с динамическим запросом.

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()]));

        };
    }
}

Ниже приведен мой тестовый класс, в котором я пытаюсь протестировать динамический запрос.

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 и печатает первую строку «Я в запросе» и возвращает.Проверка условных предложений в запросе не идет дальше.

Я также пытался вызывать метод непосредственно из тестового класса, так как

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

Все тот же результат.Я недавно начал с Mockito, так что я не уверен, что я что-то здесь упускаю, что вызывает такое поведение.

Как я могу убедиться, что все мои строки выполняются с точки зрения покрытия кода.

1 Ответ

1 голос
/ 19 сентября 2019

Specification - это функциональный интерфейс, и вы возвращаете функцию, которая будет вызываться пружиной под колпаком (после того, как вы передадите ее подходящему методу хранилища).В тесте вы смоделируете этот метод репозитория, чтобы не было возможности выполнить эту возвращенную функцию.

В случае Specification эта функция называется toPredicate()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...