[英]Why does MockMvc always return empty content()?
我正在尝试使用 mockMvc 测试我的 rest api。
mockMvc.perform(get("/users/1/mobile")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(print())
.andExpect(content().string("iPhone"))
测试失败的原因是:
java.lang.AssertionError: Response content
Expected :iPhone
Actual :
从print()
的输出中,我可以知道 API 实际上返回了预期的字符串“iPhone”。
ModelAndView:
View name = users/1/mobile
View = null
Attribute = treeNode
value = "iPhone"
errors = []
我猜上面空的“实际”是由下面的空“正文”引起的
MockHttpServletResponse:
Status = 200
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = users/1/mobile
Redirected URL = null
Cookies = []
我的问题是:
MockHttpServletResponse's
Body是空的;如果您的操作方法(带有@RequestMapping
注释的方法)返回ModelAndView
实例或者您使用Model
,则必须使用MockMvcResultMatchers#model
函数对其进行测试:
.andExpect(MockMvcResultMatchers.model().attribute("phone", "iPhone"))
.andExpect(MockMvcResultMatchers.model().size(1))
MockMvcResultMatchers#contnet
适用于 REST 操作方法(带有@RequestBody
注释的方法)。
要更好地了解测试 Spring MVC 和 Spring REST 控制器,请检查以下链接:
只是为这个错误添加另一个原因,我花了一整天才发现。 我使用 perform 方法成功地使用 mockito 和 mockmvc 类创建了一个 APITest。 然后复制代码以生成另一个服务,我开始一遍又一遍地得到一个空的主体。
尽管如此,在一天结束时,我决定将一个项目中的每个复制类与另一个进行比较。 我发现的唯一区别是新控制器接收到的请求 DTO 中的@EqualsAndHashCode
注释。
因此,建议是:在 DTO 类中添加@EqualsAndHashCode
注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.