Jeśli chcesz to przetestować jednostkowo to robisz to zwyczajnie jak to w Javie:
@Test(expected = NoProductsFoundUnderCategoryException.class)
public void shouldThrowExceptionWhenCategoryNull() throws Exception {
List<Product> emptyList = new ArrayList<>();
when(mockRepository.findByCategory("phone")).thenReturn(emptyList);
productController.getProductsByCategory("phone" ...);
verify(mockRepository, times(1)).findByCategory("phone");
}
Natomiast tak jak wspomniał Arkadiusz Fajdek, bardziej integracyjne taki test nie ma trochę sensu, bo robiąc zapytanie HTTP nie ma możliwości aby klient dostał Javowy wyjątek. Musiał by on być z serializowany np. do JSON i sprawdzany po stronie klienta. Co prawda jest to domyślnie jakoś robione bo w Twoim przypadku body w momencie wyrzucenia wyjątku będzie podobne do:
{
"timestamp": "2019-03-13T20:30:14.941+0000",
"status": 500,
"error": "Internal Server Error",
"message": "No message available",
"path": "/products/adasd"
}
Domyślna sygnalizacja wyjątków dla klientów HTTP to zdaje się zwrócenie błędu HTTP 500 Internal Server Error.
Do łapania wyjątków w Springu jest coś takiego:
https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/web.html#mvc-ann-exceptionhandler
Jednak to jest bardziej pod REST API tak mi się wydaje. Ty zdaje się robisz bardziej tradycyjną aplikację MVC. I w tym wypadku takie rzucanie wyjątku jest chyba nadmiarowe. Po prostu wsadź tę listę do modelu tak jak jest i sprawdzenie zrób po stronie widoku:
@GetMapping("/{category}")
public String getProductsByCategory(Model model, @PathVariable("category") String productCategory) {
List<Product> productsByCategory = productRepository.findByCategory(productCategory);
model.addAttribute("products", productsByCategory);
return "allProducts";
}
Dodam jeszcze, że w przypadku, kiedy coś jest szukane względem czegoś i to zwraca listę/tablicę to gdy tego czegoś nie będzie to dobrą praktyką jest zwracanie pustej listy/tablicy, a nie nulla (Wspominam o tym bo masz tam sprawdzenie czy lista jest nullem).