Я должен проверить параметр пути, чтобы он содержал только цифры, используя Mockito.
Мой код:
@Slf4j
@Validated
public class TestController {
private final TestService service;
@GetMapping("/path/{Id}")
public ResponseEntity process(@Valid @Pattern(regexp = "\\d+", message =
"Id should be only digits") (message = "Id is required")
@PathVariable("Id")
String customerAccountId){
service.processRequest(Id);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
}
Я добавил совет контроллера, чтобы перехватить исключение
@Slf4j
@RestControllerAdvice
public class ControllerAdviser extends ResponseEntityExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
protected ResponseEntity<Object> handleConstraintViolationException(
ConstraintViolationException ex, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
Map errorMap = error(ex.getConstraintViolations()
.stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.toList()));
ErrorModel errorModel = ErrorModel.builder()
.userMessage("Input request parameters are invalid")
.developerMessage(errorMap.toString())
.statusCode(BAD_REQUEST.value())
.build();
return handleExceptionInternal(ex, errorModel, headers, BAD_REQUEST, request);
}
......
}
Ниже приведена моя попытка написания проверочного теста, который не прошел:
@Test
public void shouldReturnBadRequestWhenIDoesntContainDigits() throws Exception {
MockMvc mockMvc = standaloneSetup(new TestController(service))
.build();
String END_ENDPOINT = "/path/45673423dddd";
ResultActions resultActions = this.mockMvc
.perform(get(END_ENDPOINT)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON));
System.out.println(resultActions.andReturn());
resultActions
.andDo(print())
.andExpect(status().isBadRequest());
}
java.lang.AssertionError: Status
Expected :400
Actual :204
<Click to see difference>
Что я делаю не так, что этот тест не пройден?Не могли бы вы посоветовать мне, как проверить мой случай?