我有以下帶有動態(tài)查詢的服務類。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()])); }; }}下面是我的測試類,我正在嘗試測試動態(tài)查詢。public class CarServiceTest {@Mockprivate CarService carService;@Testpublic 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 并打印第一行“我正在查詢”并返回。它不會進一步檢查查詢中的條件子句。我還嘗試直接從測試類調(diào)用該方法carService.getCarDetails(carRequest. "ABC", “A123”);結(jié)果還是一樣。我最近開始使用 Mockito,所以我不確定我是否在這里遺漏了導致此行為的某些內(nèi)容。我如何確保我的所有行都從代碼覆蓋率的角度執(zhí)行。
1 回答

慕妹3242003
TA貢獻1824條經(jīng)驗 獲得超6個贊
Specification
是函數(shù)式接口,您返回的函數(shù)將由 spring 在后臺調(diào)用(當您將其傳遞給合適的存儲庫方法之后)。在測試中,您模擬該存儲庫方法,因此沒有機會執(zhí)行該返回的函數(shù)。
如果Specification
調(diào)用此函數(shù)toPredicate()
添加回答
舉報
0/150
提交
取消