Я пытаюсь протестировать службу, которая должна генерировать исключение, если в базе данных не было найдено результата. Я пытаюсь проверить случай, когда значение не найдено путем создания исключения 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)
}
Я думаю, вы забыли использовать 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()));
Затем тест терпит неудачу, как и ожидалось: