Шаблон Rest не возвращает объект ответа после обработчика исключений - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть следующий метод контроллера

@PostMapping(consumes = "application/json",
             produces = "application/json")
public ResponseEntity<Board> createBoard(@Valid @RequestBody 
BoardRequestDTO boardRequestDTO) {
    Board board = new Board();
    board.setName(boardRequestDTO.getName());
    board.setCompanyId(Integer.valueOf(boardRequestDTO.getCompanyId()));
    board.setCode(boardRequestDTO.getCode());
    Board dbBoard = boardRepository.save(board);
    return new ResponseEntity<>(dbBoard, HttpStatus.CREATED);
} 

И у меня есть следующий обработчик исключений для него, который обрабатывает ошибку проверки

@ControllerAdvice
public class ExceptionHandlerConfig extends ResponseEntityExceptionHandler   {
    @Override
    protected ResponseEntity<Object>       
    handleMethodArgumentNotValid(MethodArgumentNotValidException ex, 
       HttpHeaders headers, HttpStatus status, WebRequest request) {
       ValidationErrorResponses validationErrorResponses = new 
       ValidationErrorResponses();
       for (FieldError fieldError : ex.getBindingResult().getFieldErrors())
       validationErrorResponses.addError(new ValidationError(fieldError.getField(),fieldError.getDefaultMessage()));

       ResponseEntity<Object> responseEntity = new ResponseEntity<Object> 
       (validationErrorResponses, HttpStatus.UNPROCESSABLE_ENTITY);
       return responseEntity;
    }

 }

Когда я отправляю запрос на отказ через Почтальон, я получаю предсказуемыйответ:

{
    "errors": [
         {
            "field": "companyId",
            "message": "Must be digit"
         }
    ]
}

Но когда я пытаюсь реализовать следующий модульный тест для этой конечной точки, я получаю org.springframework.web.client.HttpClientErrorException $ UnprocessableEntity: 422 null

:

boardDTO.setCompanyId("");
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "application/json");
headers.set("Accept", "application/json");
HttpEntity<ValidationErrorResponses> httpEntity = new HttpEntity(boardDTO, headers);

ResponseEntity<ValidationErrorResponses> responseEntity = 
restTemplate.postForEntity(url, httpEntity, ValidationErrorResponses.class);

ValidationErrorResponses responseBody = responseEntity.getBody();
assertEquals(422, responseEntity.getStatusCode());
assertEquals("companyId", responseBody.getErrors().get(0).getField());
assertEquals("Must be digit", responseBody.getErrors().get(0).getMessage()); 

Что мне делать, чтобы мой тест работал правильно?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

restTemplate.postForEntity вызовет исключение HttpClientErrorException, когда статус> = 400 и <500. Простой способ написать тест здесь: </p>

try {
  restTemplate.postForEntity(url, httpEntity, ValidationErrorResponses.class);
  fail("should throw exception");
} catch (HttpClientErrorException e) {
  // Asserts go here using `e`
}
0 голосов
/ 08 апреля 2019

Чтобы избежать тестирования реализации, предлагаю протестировать с исключением «был брошен».Возвращаемое сообщение об исключении должно быть частью модульного теста из исключения:

@Test(expected = MethodArgumentNotValidException.class)
public void testMethodArgumentNotValidException() {
    boardDTO.setCompanyId("");
    HttpHeaders headers = new HttpHeaders();
    headers.set("Content-Type", "application/json");
    headers.set("Accept", "application/json");
    HttpEntity<ValidationErrorResponses> httpEntity = new HttpEntity(boardDTO, headers);

    ResponseEntity<ValidationErrorResponses> responseEntity = 
    restTemplate.postForEntity(url, httpEntity, ValidationErrorResponses.class);

}

В противном случае спросите себя, можете ли вы обработать тело результата с помощью пользовательского приемочного теста?

...