RestControllerAdvice не вызывается в тестировании интеграции JUnit - PullRequest
0 голосов
/ 17 марта 2020

В 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.

существует переопределенный обработчик.
...