我必须使用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>
我在做什么错,这个测试用例失败了吗?您能建议我如何测试我的案子吗?