Спок - смоделированный метод репозитория save (), выдающий исключение NullPointerException - PullRequest
0 голосов
/ 05 ноября 2018

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

Вот мой модульный тест:

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», работал как задумано?

1 Ответ

0 голосов
/ 06 ноября 2018

Пожалуйста, проверьте документацию Спока: http://spockframework.org/spock/docs/1.0/interaction_based_testing.html

Раздел: Сочетание насмешек и окурков

Объединение:

given:
...
parkingSessionRepository.save(_ as ParkingSession) >> testParkingSession
...
then:
1 * parkingSessionRepository.save(_ as ParkingSession)

Не будет работать. Вы должны использовать одно выражение:

1 * parkingSessionRepository.save(_ as ParkingSession) >> testParkingSession
...