【发布时间】:2022-01-21 14:20:06
【问题描述】:
我有这样的端点:
@PostMapping("/departure")
public ResponseEntity<String> departure(@RequestBody CarAtGateModel carAtGateModel) throws UnidentifiedCarException {
CarAndParkingEntity carAndParkingEntity = carsAndParkingsRepository.findByIdCar(
carAtGateModel.getCarEntity().getIdCar()).orElseThrow(() -> new UnidentifiedCarException());
carAndParkingEntity.setIdParking("-1");
carsAndParkingsRepository.flush();
return new ResponseEntity<>(responsesMessages.gateUp(), HttpStatus.OK);
}
接下来我想用模拟做一些测试,比如:
@Test
public void departureWorksWhenCarOnDepartureIsRecognized() {
//given
carsAndParkingsRepository = mock(CarsAndParkingsRepository.class);
CarAndParkingEntity carAndParkingEntity = new CarAndParkingEntity();
CarAtGateModel carAtGateModel = new CarAtGateModel();
CarEntity carEntity = new CarEntity();
carEntity.setIdCar("-1");
carEntity.setProducer("a");
carEntity.setModel("b");
carEntity.setWidth(1.6);
carEntity.setPowerType(PowerType.PB);
carAtGateModel.setCarEntity(carEntity);
carAtGateModel.setParkingId("parkingId");
//when
when(carsAndParkingsRepository.findByIdCar(carEntity.getIdCar())).thenReturn(Optional.of(carAndParkingEntity));
HttpEntity<CarAtGateModel> request = new HttpEntity<>(carAtGateModel);
ResponseEntity<String> response = testRestTemplate.postForEntity("/departure", request, String.class);
//then
assertEquals(200, response.getStatusCodeValue());
}
返回可选的模拟存储库正常工作,它返回carAndParkingEntity。
但是测试没有通过,因为它抛出了UnidentifiedCarException,我不明白为什么当carsAndParkingsRepository.findByIdCar(carEntity.getIdCar()) 返回可选时我会得到异常,所以它应该存在......
【问题讨论】:
-
您在测试方法中模拟了存储库,但它是如何注入到您的控制器中的?这只是一个猜测,因为我们看不到整个测试类设置,但您可能需要使用
@Mock或@MockBean注释将存储库声明为测试类的成员变量,并将@InjectMocks添加到控制器. -
我有公共 CarsAndParkingsRepository carsAndParkingsRepository;在设置中我添加了 carsAndParkingsRepository = mock(CarsAndParkingsRepository.class);
标签: spring testing exception mocking