Проверка неверного запроса при публикации неполной сущности с помощью Spring Boot - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь протестировать создание сущности с неполными данными следующим образом:

@Test
public void postVisitor_withIncompleteData_shouldFailWithBadRequest() throws Exception {
    Visitor emptyVisitor = new Visitor();

    mockMvc.perform(post("/visits")
            .contentType(APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(visitor))
            ).andExpect(status().isBadRequest());
}

Но мой тест не проходит с этой ошибкой:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [com.reweb.Visitor] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='cannot be empty', propertyPath=email, rootBeanClass=class com.reweb.Visitor, messageTemplate='{javax.validation.constraints.NotEmpty.message}'}
]

Как я могу проверитьэто неверный запрос?

Добавление @Test(expected = ConstraintViolationException.class) тоже не сработает.

1 Ответ

0 голосов
/ 02 ноября 2018

Если вы уже настроили @Valid с @ResponseBody в контроллере, то вам необходимо создать ExceptionHandlerInterceptor, как показано ниже:

    @RestControllerAdvice
    @Slf4j
    public class ApplicationExceptionInterceptor extends ExceptionHandlerExceptionResolver {

      @ExceptionHandler(Throwable.class)
      public
        ResponseEntity<Response<?>>
        handleControllerException(final HttpServletRequest request, final Throwable ex) {

        if (ex instanceof MethodArgumentNotValidException) {
          log.error(ex.getMessage());
          final MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;
          final List<ObjectError> errors = exception.getBindingResult().getAllErrors();
          final List<FaultDetail> faultDetailsList = new ArrayList<>();
          final List<String> error = new ArrayList<>();
          errors.forEach(action -> error.add(action.getDefaultMessage()));
          faultDetailsList.add(new FaultDetail(error));

        }
return ResponseEntity.body(faultList).status(HttpStatus.BAD_REQUEST).build();
}

Вам также необходимо предоставить этот ExceptionHandler для MockMvc, как показано ниже,Я предоставляю RestAssuredMockMvc должна быть похожая конфигурация для MockMvc:

@BeforeMethod
public void initializeMockMvcWithControllerAdvice(Object controller, Object controllerAdvice, ContentType contentType) {
    RestAssuredMockMvc.reset();
    RestAssuredMockMvc.mockMvc(MockMvcBuilders.standaloneSetup(new Object[]{controller}).setControllerAdvice(new Object[]{controllerAdvice}).build());
    RestAssuredMockMvc.requestSpecification = (new MockMvcRequestSpecBuilder()).setContentType(contentType).build();
  }
...