Как обрабатывать @Valid MethodArgumentNotValidException с помощью @RestControllerAdvice - PullRequest
0 голосов
/ 15 декабря 2018

Helo,
У меня проблема с контроллером тестирования, который выдает исключение MethodArgumentNotValidException.

У меня есть объект с аннотацией проверки.

public class Tag extends ResourceSupport {
...
    @NotEmpty(message = "Tag name cannot be empty.")
    @NotNull(message = "Tag name cannot be empty.")
    private String name;
}

Контроллер с аннотацией @Valid для @ RequestBody

@RestController
@RequestMapping(value="/api/tags")
public class TagController {
    .......

    @PostMapping(value = "")
    public ResponseEntity<Tag> addNewTag(@Valid @RequestBody Tag tag) {
        Tag createdTag = tagService.saveOrUpdate(tag);
        return new ResponseEntity<>(createdTag, HttpStatus.CREATED);
    }

}

Теперь я хочу протестировать этот контроллер с модульным тестом

@RunWith(MockitoJUnitRunner.class)
public class TagControllerTest {
     private MockMvc mockMvc;

     @Before
     public void setup() {
            JacksonTester.initFields(this, new ObjectMapper());
            mockMvc = MockMvcBuilders.standaloneSetup(tagController).setControllerAdvice(new GlobalExceptionHandlerController()).build();
        }

    @Test
    public void shouldntAllowToSetTagNameEmpty() throws Exception {
        Tag tag1 = new Tag();

        mockMvc.perform(post("/api/tags").contentType(MediaType.APPLICATION_JSON)
            .content(jsonTags.write(tag1).getJson()))
            .andExpect(status().isBadRequest());

   }

Глобальный класс обработки исключенийСоздан таким образом. Это только в качестве примера формы Интернет.

@RestControllerAdvice
public class GlobalExceptionHandlerController extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
        MethodArgumentNotValidException ex,
        HttpHeaders headers,
        HttpStatus status,
        WebRequest request) {

    String bodyOfResponse = ex.getMessage();
    return new ResponseEntity(bodyOfResponse, headers, HttpStatus.BAD_REQUEST);
}

Тест проходит, так как это только статус теста, но в консоли у меня есть трассировка стека с журналом ошибок

org.springframework.web.bind.MethodArgumentNotValidException: проверка не удалась для аргумента с индексом 0 в методе: ..... сообщение по умолчанию [Имя тега не может быть пустым.]]

Это правильно, эта ошибкатрассировки стека появляются в журнале консоли?

1 Ответ

0 голосов
/ 15 декабря 2018

Ваша реализация работает нормально, это нормальное поведение, во время тестов MockMvc печатает детали MvcResult, используя

PrintingResultHandler

, поэтому он также будет печатать исключения, разрешенные с помощьюHandlerExceptionResolver путем вызова printResolvedException ()

извлечение PrintingResultHandler

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