我正在使用MockMvc
测试@RestController
POST端点。在本试验中,MockHttpServletResponse
含量始终为空&未设置内容类型。我检查了控制器方法;它被调用并返回正确的响应。在测试中,状态码被正确地设置为201。
下面是测试:
@Test
public void testBookCreation() throws Exception {
var response = mockMvc.perform(
MockMvcRequestBuilders
.post("/books/create")
.contentType(MediaType.APPLICATION_JSON)
.content(
jsonb.toJson(new Book("KR","K & R",5,8))
)
).andExpect(
MockMvcResultMatchers.status().isCreated()
).andExpect(
MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)
).andExpect(
MockMvcResultMatchers.jsonPath("$.author").exists()
).andDo((result)->{
System.out.println(result.getResolvedException());
System.out.println(result.getResponse());
}).andReturn();
}
这里是控制器方法:
@PostMapping("/create")
@ResponseStatus(code=HttpStatus.CREATED,reason="Book created")
public Book makeBook(@RequestBody Book b ) {
var res = bookRepository.save(b);
System.out.println(res);
return res;
}
我认为问题出在测试上,而不是控制器本身。
ResponseStatus
的文档说明如下:
警告:当在异常类上使用该注释时,或者当设置该注释的reason属性时,HttpServletResponse. js将被调用。
意味着你将收到如下形状的响应,不管你的控制器中发送的响应载荷是什么:
{
"timestamp":"",
"status":201,
"error":"Created",
"message":"",
"path":"/books/create"
}
你应该为ReponseStatus
注释删除reason
字段:
@PostMapping("/create")
@ResponseStatus(code=HttpStatus.CREATED)
public Book makeBook(@RequestBody Book b ) {
var res = bookRepository.save(b);
System.out.println(res);
return res;
}