Как проверить обработку исключений в @ControllerAdvice - PullRequest
0 голосов
/ 21 апреля 2020

У меня в приложении есть два ControllerAdvice, я должен объединить их в один. Но мне нужно проверить их до и после слияния, протестировать исключение и объект, который мне возвращает контроллер.

Я пытаюсь сделать jUnit-тест с Mockito, но кажется, что невозможно протестировать исключения без любой контекст, без контроллера и т. д. c ...

Кто-нибудь знает, как я могу добиться того, что я пытаюсь сделать?

Я также пытаюсь бросить вручную исключение, но, очевидно, оно не было перехвачено ControllerAdvice.

Итак, в основном вот что я пытаюсь сделать: вывести исключение вручную Это исключение обрабатывается моим ControllerAdvice. Проверьте возвращенный объект (код и сообщение).

Вот пример кода, который у меня есть:

@Before
public void setup() {
  ...
    mockMvc = MockMvcBuilders.standaloneSetup(getController())
                .setControllerAdvice(new GlobalControllerExceptionHandler())
                .setCustomArgumentResolvers(resolver, resolver_0, resolver_1)
                .setHandlerExceptionResolvers(exceptionResolver).build();
}


@Controller
@RequestMapping("/tests")
public static class RestProcessingExceptionThrowingController {

    @RequestMapping(value = "/exception", method = GET)
    public @ResponseBody String find() {
        throw new EntityNotFoundException();
    }
}

@Test
public void testHandleException() throws Exception {
    mockMvc.perform(get("/tests/exception"))
            .andExpect(new ResultMatcher() {


                @Override
                public void match(MvcResult result) throws Exception {
                    result.getResponse().getContentAsString().contains("global_error_test");
                }
            })
            .andExpect(status().isNotFound());
}

У меня есть хороший код состояния в конце, но он не использует мой ControllerAdvice (я пытаюсь с отладчиком)

1 Ответ

1 голос
/ 22 апреля 2020

Вы можете просто вызвать метод-обработчик напрямую

@ControllerAdvice

MyAdvice{

    @ExceptionHandeler(listOfExxcetpions)
    public ResponseEntity someOfMyExceptionsHandler(Exception e){
       .....
     }  

}

и в тесте

MuTest{
private MyAdvice advice=new MyAdvice();

@Test
public void oneOfTests(){
    Exception e=new SomeSortOfExceptionToTest();
    resp=advice.someOfMyExceptionsHandler(e)
    assertThat(resp).....dostuff;
}

}

Если вы хотите проверить, как Spring интегрируется с вашими обработчиками - если ваши аннотации верны, упорядочите serialization et c - это будет интеграционный тест, и вам придется загружать тестовый контекст - тогда вы можете генерировать исключения непосредственно из методов контроллера.

...