Spring Boot, глобальная обработка исключений и тестирование - PullRequest
0 голосов
/ 10 июня 2018

Короче говоря.Мой сервис, выбрасывает исключения EntityNotFound.По умолчанию Spring boot не знает, что такое исключение king и как его лечить, и просто отображает «500 Internal Server Error».

У меня не было выбора, кроме как реализовать собственный механизм обработки исключений.

Есть несколько способов решения этой проблемы с загрузкой Spring.И я решил использовать @ControllerAdvice с методами @ExceptionHandler.

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<ErrorDetails> handleNotFound(EntityNotFoundException exception, HttpServletRequest webRequest) {
    ErrorDetails errorDetails = new ErrorDetails(
            new Date(),
            HttpStatus.NOT_FOUND,
            exception,
            webRequest.getServletPath());

    return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
 }
}

Поэтому, когда генерируется исключение, новый обработчик ловит исключение и возвращает хороший json, содержащий сообщение, например:

{
"timestamp": "2018-06-10T08:10:32.388+0000",
"status": 404,
"error": "Not Found",
"exception": "EntityNotFoundException",
"message": "Unknown employee name: test_name",
"path": "/assignments"
}

Реализация - не так сложно.Самое сложное - это тестирование.

Прежде всего, во время тестирования пружина, похоже, не знает о новом обработчике в тестовом режиме.Как я могу сказать Spring, чтобы быть в курсе новой реализации для обработки таких ошибок?

@Test
public void shouldShow404() throws Exception {
    mockMvc.perform(post("/assignments")
            .contentType(APPLICATION_JSON_UTF8_VALUE)
            .content(new ClassPathResource("rest/assign-desk.json").getInputStream().readAllBytes()))
            .andExpect(status().isNotFound());
}

Насколько я понимаю, этот тест должен пройти, но это не так.

Любые мысли приветствуются.Благодарю вас!

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Нашел ответ.

Для кого это может касаться:

Настройки класса apon:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class GlobalExceptionHandlerTest{
//
}

и тест:

@Test
public void catchesExceptionWhenEntityNotFoundWithSpecificResponse() throws Exception {

    mockMvc.perform(post("/assignments")
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content(new ClassPathResource("rest/assign-desk.json").getInputStream().readAllBytes()))
            .andExpect(status().isNotFound())
            .andExpect(jsonPath("status").value(404))
            .andExpect(jsonPath("exception").value("EntityNotFoundException"))
            .andExpect(jsonPath("message").value("Unknown employee name: abc"));
}

Спасибо всем.

0 голосов
/ 10 июня 2018

Возможный дубликат вопроса или вопроса github .Не знаю, как вы настраиваете свой тестовый класс.Но если у вас есть тестовый класс, помеченный WebMvcTest , все контроллеры и советы по контроллеру должны быть зарегистрированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...