Желаемая, но не вызванная операция удаления модульного теста JPA

#java #unit-testing #jpa #mockito

#java #модульное тестирование #jpa #mockito

Вопрос:

У меня возникла некоторая проблема при попытке создать тестовые примеры junit для удаления с помощью JPA. В моем классе обслуживания я использую функцию по умолчанию, предоставляемую JPA:

 public void delete(Long id) {
        log.debug("Request to delete Enroll : {}", id);
        enrollRepository.deleteById(id);
}
  

Затем в моем модульном тестировании я пытаюсь имитировать объект, а затем выполнить удаление:

 @Test
public void testDeleteEnrollExpectSuccess() {
    Enroll enroll = prepareEnrollWithBedAllocation();
    enrollService.delete(enroll.getId());
    verify(enrollRepository, times(1)).delete(enroll);
}
  

Я пытаюсь издеваться над объектом enroll следующим образом:

 private Enroll prepareEnrollWithBedAllocation() {
    LocalDateTime localDateTime = LocalDateTime.now();
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"));

    Enroll enroll = new Enroll();
    enroll.setId(new Long(1));
    enroll.seteDate(zonedDateTime);
    enroll.setEbStartdt(zonedDateTime);
    enroll.setEbEnddt(zonedDateTime);
    enroll.setBed(prepareBed());
    enroll.setPatient(preparePatient());
    enroll.setDoc(prepareDoc());
    enroll.seteCondition("Normal");
    return enroll;
}
  

Однако я получаю эти сообщения об ошибках, и мой тестовый пример был неудачным:

 Wanted but not invoked:
enrollRepository.delete(
    Enroll{id=1, eCondition='Normal', eRemarks='null', ebStartdt='2019-04-09T16:40:32.703Z[UTC]', ebEnddt='2019-04-09T16:40:32.703Z[UTC]', eDate='2019-04-09T16:40:32.703Z[UTC]'}
);
-> at com.team.generated.service.EnrollServiceTest.testDeleteEnrollExpectSuccess(EnrollServiceTest.java:61)

However, there was exactly 1 interaction with this mock:
enrollRepository.deleteById(1L);
-> at com.team.generated.service.EnrollService.delete(EnrollService.java:74)
  

Есть идея? Спасибо!

Ответ №1:

Ошибка говорит сама за себя: вы проверяете метод delete(Long id) :

 verify(enrollRepository, times(1)).delete(enroll);
  

Однако ваш объект service вызывает deleteById() метод:

 enrollRepository.deleteById(id);
  

Я думаю, вы хотите сделать это:

 @Test
public void testDeleteEnrollExpectSuccess() {
    Enroll enroll = prepareEnrollWithBedAllocation();
    enrollService.delete(enroll.getId());
    verify(enrollRepository, times(1)).deleteById(enroll.getId());
}
  

Комментарии:

1. Могу я уточнить у вас, есть ли у вас какой-либо пример модульного теста для обновления?

2. @hyperfkcb, нет, но это делается таким же образом. Только не путайте выполняемые методы.