繁体   English   中英

为什么 MockMvc 总是返回空的 content()?

[英]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 = []

我的问题是:

  1. 为什么MockHttpServletResponse's Body是空的;
  2. 如何正确测试 API 的响应。

如果您的操作方法(带有@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM