Как проверить в тесте Спока, что исключение создано в реактивном классе Spring

Я пытаюсь протестировать службу, которая должна генерировать исключение, если в базе данных не было найдено результата. Я пытаюсь проверить случай, когда значение не найдено путем создания исключения NotFoundException. Вот служба. Я хочу проверить условие, когда результат не найден, но ожидаемое исключение не выдается в моем тесте. Я включил тестовый фрагмент.

@Service
@RequiredArgsConstructor
public class ProductService {
  private final ProductRepository ProductRepository;

  public Mono<Product> getProductById(Long Id){
    return ProductRepository.findProductById(Id)
    .switchIfEmpty(Mono.error(new NotFoundException("No Product found")));
  }
}

Вот мой тест, ненужные части для краткости опущены

def 'A Product resource by product id which does not exist in db'() {

  given:
                    
  def id = 4444L

  productRepository.findProductById(id) >> Mono.empty()

  when: 'A call to get a Product is made to the service but cannot be found'

  def result = productService.getProductById(id)

  then: 'A NotFoundException is thrown from the service'
  
  // Does not work 
  StepVerifier.create(result).expectError(NotFoundException)
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
2
0
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы забыли использовать verify() в конце своей цепочки StepVerifier. Нам нужно поставить verify() или другие варианты в конце цепочки. В противном случае StepVerifier не подпишется на нашего издателя.

Вот рабочий пример для вашего тестового сценария:

@ExtendWith(SpringExtension.class)
public class ProductTest {

    @TestConfiguration
    public static class ProductTestConfiguration {

        @MockBean
        public ProductRepository productRepository;

        @Bean
        public ProductService productService() {
            return new ProductService(productRepository);
        }
    }

    @Autowired
    private ProductRepository productRepository;
    @Autowired
    private ProductService productService;

    @Test
    public void when_not_found_ends_with_exception() {
        Long id = 4444L;
        // repository setup
        Mockito.when(productRepository.findProductById(id))
                .thenReturn(Mono.empty());
        // expect error, don't forget to call verify()
        StepVerifier.create(productService.getProductById(id))
                .expectError(NotFoundException.class)
                .verify();
    }
}

Вы можете увидеть, что тест пройден:


Если я изменю настройку репозитория с помощью

// return not empty, return new product
Mockito.when(productRepository.findProductById(id))
                .thenReturn(Mono.just(new Product()));

Затем тест терпит неудачу, как и ожидалось:

Другие вопросы по теме