Правильный способ проверить почтовую службу, которая может вызвать исключение с помощью Mockito?

#spring #unit-testing #spring-mvc #mockito

Вопрос:

У меня есть простая служба REST, написанная на Java (Spring Boot). Идея состоит в том, чтобы разрешить пользователю добавлять новую сущность, если эта сущность не существует. Если он существует, я создаю исключение.

Вот код:

     public ResponseEntity<String> addReadings(int clientId, int year, int month, double additionalConsumption) throws NoSuchMessageException, IllegalModificationException{     
    
    Optional<Client> clientOptional = clientService.findByClientId(clientId);

    if (clientOptional.isEmpty()) {
        return ResponseEntity.status(HttpStatus.NO_CONTENT)
                             .header("message", messageSource.getMessage("client.error1", null, new Locale("EN")))
                             .build(); 
    }
    
    Optional<Reading> reading = readingService.findByClientAndYearAndMonth(clientOptional.get(), year, month);
    
    if (reading.isPresent()) throw new IllegalModificationException(messageSource.getMessage("consumption.error2", null, new Locale("EN")));
            
    readingService.save(Reading.builder()
                                .client(clientOptional.get())
                                .year(year)
                                .month(month)
                                .consumption(additionalConsumption)
                                .build());
    

    return ResponseEntity
            .status(HttpStatus.OK)
            .body(messageSource.getMessage("sucess", null, new Locale("EN")));
}
 

Вопрос в том, как проверить выбрасывание исключения с помощью Mockito в Spring framework, используя самый простой и чистый способ?

Ответ №1:

Имитируйте readingService так, чтобы readingService.findByClientAndYearAndMonth возвращалось необязательное значение, представляющее некоторое значение, т. Е. reading.isPresent() is true .

что-то вроде:

 Client client = ...
ReadingServiceClass readingService = Mockito.mock(ReadingServiceClass.class);
Mockito
  .when(readingService.findByClientAndYearAndMonth(client, 10, 2020))
  .thenReturn(Optional.of(new Reading(...)));
// ... inject readingService into objectToTest 
try {
  objectToTest.addReadings(1, 2020, 10, 1.0d);
  Assert.fail();
}  (catch IllegalModificationException e) {
  // ... assert details of exception
}
 

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

1. Можете ли вы сказать мне, каково имя пакета для импорта Assert.fail()