У меня есть приложение Spring Boot и вы хотите, чтобы мои контроллеры REST были интегрированы с помощью теста интеграции. Вот мой контроллер:Тестирование Spring Boot: исключение в контроллере REST
@RestController
@RequestMapping("/tools/port-scan")
public class PortScanController {
private final PortScanService service;
public PortScanController(final PortScanService portScanService) {
service = portScanService;
}
@GetMapping("")
public final PortScanInfo getInfo(
@RequestParam("address") final String address,
@RequestParam(name = "port") final int port)
throws InetAddressException, IOException {
return service.scanPort(address, port);
}
}
В одном из тестов, которые я хочу, чтобы проверить, что конечная точка генерирует исключение, в некоторых обстоятельствах. Вот мой тестовый класс:
@RunWith(SpringRunner.class)
@WebMvcTest(PortScanController.class)
public class PortScanControllerIT {
@Autowired
private MockMvc mvc;
private static final String PORT_SCAN_URL = "/tools/port-scan";
@Test
public void testLocalAddress() throws Exception {
mvc.perform(get(PORT_SCAN_URL).param("address", "192.168.1.100").param("port", "53")).andExpect(status().isInternalServerError());
}
}
Каков наилучший способ сделать это? Текущая реализация не обрабатывает InetAddressException которого выкинули из PortScanController.getInfo(), и когда я начинаю тест, я получаю и ошибка:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.handytools.webapi.exceptions.InetAddressException: Site local IP is not supported
Это не представляется возможным указать ожидаемое исключение в @Test аннотацию, так как оригинал InetAddressException является завернутый с помощью NestedServletException.
Спасибо, Борис. Как я могу это сделать, учитывая, что у меня есть автоконфигурированный экземпляр MockMvc? – DavyJohnes
Я имел в виду обработчик исключений для вашего приложения, а не ваш тест. Чтобы ваше приложение объявляло '@ExceptionHandler (InetAddressException.class)', а затем отвечает кодом состояния 400 или 503 с сообщением об ошибке, тогда ваш тест ищет ответ ожидаемого кода состояния и ожидаемого сообщения об ошибке. – borowis
, потому что то, что вы получаете, действительно является ошибкой проверки, поэтому мне кажется, что код 400 вместе с сообщением об ошибке мне подходит – borowis