Я использую Спока для модульного тестирования сервиса в моем приложении. Недавно я столкнулся со странным поведением, которого я действительно не понимаю.
Вот мой модульный тест:
def setup() {
parkingSessionRepository = Mock(ParkingSessionRepository.class)
parkingSessionMapper = Stub(ParkingSessionMapper.class)
parkingMeterService = new ParkingMeterService(parkingSessionRepository, parkingSessionMapper)
}
def "should start parking session for vehicle that doesn't have an active parking session"() {
given:
String testVehicleId = "AWC1342"
long testParkingRateId = 1
ParkingStartDTO testParkingStartDTO = ParkingStartDTO.builder()
.vehicleId(testVehicleId)
.parkingRateId(testParkingRateId)
.build()
ParkingSession testParkingSession = ParkingSession.builder()
.vehicleId(testVehicleId)
.parkingRate(ParkingRate.REGULAR)
.build()
parkingSessionMapper.fromParkingStartDTO(_) >> testParkingSession
parkingSessionRepository.save(_ as ParkingSession) >> testParkingSession
parkingSessionRepository.findByVehicleIdAndStopTimeIsNull(_ as String) >> Optional.empty()
when:
ParkingMeterResponseDTO parkingMeterResponseDTO = parkingMeterService.startParkingMeter(testParkingStartDTO)
then:
1 * parkingSessionRepository.save(_ as ParkingSession)
parkingMeterResponseDTO.vehicleId == testVehicleId
Assert.assertNotNull(parkingMeterResponseDTO.parkingSessionId)
Assert.assertNotNull(parkingMeterResponseDTO.timestamp)
}
Код проверенного метода обслуживания:
public ParkingMeterResponseDTO startParkingMeter(final ParkingStartDTO parkingStartDTO) {
String vehicleId = parkingStartDTO.getVehicleId();
if (isParkingSessionAlreadyActive(vehicleId)) {
throw new ParkingSessionAlreadyActiveException();
} else {
ParkingSession parkingSession = parkingSessionMapper.fromParkingStartDTO(parkingStartDTO);
parkingSession.setStartTime(Timestamp.from(Instant.now()));
parkingSession = parkingSessionRepository.save(parkingSession);
return ParkingMeterResponseDTO.builder()
.vehicleId(parkingSession.getVehicleId())
.parkingSessionId(parkingSession.getId())
.timestamp(parkingSession.getStartTime())
.build();
}
}
Теперь, когда я запускаю модульное тестирование, возникает результат исключения NullPointerException из блока when (метод save () возвращает значение null). Однако, когда я удаляю проверку метода save () из блока then, все работает без сбоев.
В чем может быть причина такого поведения? Я подозреваю некоторые насмешливые проблемы с репозиторием, но я не уверен, что именно происходит под капотом и как решить эту проблему, чтобы метод save (), проверяющий блок «then», работал как задумано?