Why does MockMvc always return empty content()?

java, spring, spring-boot

Solution

If your action methods (methods with `@RequestMapping` annotation) return instances of `ModelAndView` or you work with `Model`, you have to test it using `MockMvcResultMatchers#model` function:

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

`MockMvcResultMatchers#content` is appropriate for REST action methods (methods with `@RequestBody` annotation).

To have a better understanding about testing Spring MVC and Spring REST controllers check these links:

- Testing of Spring MVC Applications: Forms

- Testing of Spring MVC Applications: REST API

Problem

I'm trying to test my rest api with mockMvc. ``` mockMvc.perform(get("/users/1/mobile") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(print()) .andExpect(content().string("iPhone")) ``` The test failed because of: ``` java.lang.AssertionError: Response content Expected :iPhone Actual : ``` From the output of `print()`, I can know the API actually returned the expected string "iPhone". ``` ModelAndView: View name = users/1/mobile View = null Attribute = treeNode value = "iPhone" errors = [] ``` And I guess the empty "Actual" above is caused by empty "Body" below ``` MockHttpServletResponse: Status = 200 Error message = null Headers = {} Content type = null Body = Forwarded URL = users/1/mobile Redirected URL = null Cookies = [] ``` My questions are: - Why `MockHttpServletResponse's` Body is empty; - How can I correctly test the response of API.

Original source