为什么 MockMvc 总是返回空内容()?

2022-09-04 22:18:09

我正在尝试使用 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   :

从的输出中,我可以知道API实际上返回了预期的字符串“iPhone”。print()

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
  2. 如何正确测试 API 的响应。

答案 1

如果你的操作方法(带注释的方法)返回 或你使用的实例,你必须使用 MockMvcResultMatchers#model 函数对其进行测试:@RequestMappingModelAndViewModel

.andExpect(MockMvcResultMatchers.model().attribute("phone", "iPhone"))
.andExpect(MockMvcResultMatchers.model().size(1))

MockMvcResultMatchers#content 适用于 REST 操作方法(带注释的方法)。@RequestBody


要更好地了解测试Spring MVC和Spring REST控制器,请查看以下链接:


答案 2

只是为这个错误添加另一个原因,我花了一整天的时间才发现。我使用执行方法成功地使用mockito和mockmvc类创建了一个APITest。然后复制代码以生成另一个服务,我开始一遍又一遍地获得一个空的主体。

尽管如此,在一天结束时,我决定将每个复制的类从一个项目到另一个项目进行比较。我发现的唯一一个区别是新控制器收到的请求DTO中的注释。@EqualsAndHashCode

因此,建议是:在 DTO 类中添加注释。@EqualsAndHashCode


推荐