MockHttpServletResponse在测试中为空,尽管控制器工作正常



我正在使用MockMvc测试@RestControllerPOST端点。在本试验中,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;
}

最新更新