В Spring Boot 2.1.x у меня есть класс RestControllerAdvice
, который расширяет ResponseEntityExceptionHandler
, и этот тест предназначен для проверки определенного механизма обработки исключений с моим срезом контроллера, когда запрос использует метод HTTP, который не поддерживается обработчиком , Например, если обработчик помечен GetMapping
, а запрос использует POST
, то обработчик пользовательских исключений должен обработать его соответствующим образом.
@RestControllerAdvice(assignableTypes = { MyController.class })
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { … }
Я пытаюсь выполнить интеграционный тест модули со следующими конфигурациями Spring:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
MyController.class,
MyResponseEntityExceptionHandler.class} )
@AutoConfigureMockMvc
public class MyControllerIT {
@Autowired
private MyController myController;
@Autowired
private MyResponseEntityExceptionHandler myResponseEntityExceptionHandler;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(myController)
.setControllerAdvice(myResponseEntityExceptionHandler)
.build();
}
@Test
public void badActionOrHttpMethod() throws Exception {
MvcResult mvcResult =
mockMvc.perform(post(/* endpoint URL */)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.header("My-Header", "1234")
)
.andExpect(status().isMethodNotAllowed())
.andReturn();
ObjectMapper mapper = new ObjectMapper();
MyObject myObject =
mapper.readValue(/* parse it */);
// Assert certain things
}
}
Однако, когда выполняется модульный тест, выполнение не достигает MyResponseEntityExceptionHandler
, и я вижу в консоли следующее:
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
Если добавить еще один Совет, который НЕ расширяет ResponseEntityExceptionHandler
, то он исполняется во время модульного тестирования.
Я что-то здесь упускаю?
ОБНОВЛЕНИЕ : Я заметил, что когда ServletRequestBindingException
выбрасывается при отсутствии заголовка, вызывается соответствующий обработчик MyResponseEntityExceptionHandler
. Однако при попытке использовать неподдерживаемый метод HTTP MyResponseEntityExceptionHandler
не вызывается, несмотря на то, что для HttpRequestMethodNotSupportedException
.
существует переопределенный обработчик.