【发布时间】:2018-12-15 19:59:29
【问题描述】:
直升机,
我在测试抛出 MethodArgumentNotValidException 的控制器时遇到问题。
我有带有验证注释的实体。
public class Tag extends ResourceSupport {
...
@NotEmpty(message = "Tag name cannot be empty.")
@NotNull(message = "Tag name cannot be empty.")
private String name;
}
带有@RequestBody 的@Valid 注解的控制器
@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 处的参数验证失败:..... 默认消息 [标签名称不能为空。]]
错误堆栈跟踪出现在控制台日志中是否正确?
【问题讨论】: