Spring MVC控制器测试 - 打印结果JSON字符串

81

嗨,我有一个Spring MVC控制器

@RequestMapping(value = "/jobsdetails/{userId}", method = RequestMethod.GET)
@ResponseBody
public List<Jobs> jobsDetails(@PathVariable Integer userId,HttpServletResponse response) throws IOException {
    try {       
        Map<String, Object> queryParams=new LinkedHashMap<String, Object>(); 

        queryParams.put("userId", userId);

        jobs=jobsService.findByNamedQuery("findJobsByUserId", queryParams);

    } catch(Exception e) {
        logger.debug(e.getMessage());
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
    }
    return jobs;
}

我想看看运行这个测试用例后JSON字符串的样子。我编写了这个测试用例。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("classpath:webapptest")
@ContextConfiguration(locations = {"classpath:test-applicationcontext.xml"})
public class FindJobsControllerTest {
private MockMvc springMvc;

    @Autowired
    WebApplicationContext wContext;

    @Before
    public void init() throws Exception {
        springMvc = MockMvcBuilders.webAppContextSetup(wContext).build();
    }

    @Test
    public void documentsPollingTest() throws Exception {
        ResultActions resultActions = springMvc.perform(MockMvcRequestBuilders.get("/jobsdetails/2").accept(MediaType.APPLICATION_JSON));

        System.out.println(/* Print the JSON String */); //How ?
    }
}

如何获取JSON字符串?

我正在使用Spring 3和codehause Jackson 1.8.4。

6个回答

199

尝试此代码:

resultActions.andDo(MockMvcResultHandlers.print());

26
谢谢您不仅使用了 print(),而且还加上了它的类名,这与许多其他搜索结果不同! - delucasvb

73

诀窍是使用andReturn()

MvcResult result = springMvc.perform(MockMvcRequestBuilders
         .get("/jobsdetails/2").accept(MediaType.APPLICATION_JSON)).andReturn();

String content = result.getResponse().getContentAsString();

24
您可以在设置MockMvc实例时启用每个测试方法的响应打印。
springMvc = MockMvcBuilders.webAppContextSetup(wContext)
               .alwaysDo(MockMvcResultHandlers.print())
               .build();

请注意上面代码中的.alwaysDo(MockMvcResultHandlers.print())部分。这样您就可以避免为每个测试方法应用打印处理程序。


10

我使用下面的代码,它对我有效:

ResultActions result =
     this.mockMvc.perform(post(resource).sessionAttr(Constants.SESSION_USER, user).param("parameter", "parameterValue"))
        .andExpect(status().isOk());
String content = result.andReturn().getResponse().getContentAsString();

太好了!! :D

希望我的回答能帮助到其他人。


0
对于使用Spring Boot的现代项目,其中MockMvc已经通过单个@WebMvcTest“切片”测试注释为您预配置的情况下,回答这个问题最简单的方法是显式添加@AutoConfigureMockMvcprintOnlyOnFailure = false
@WebMvcTest(MyController.class)
@AutoConfigureMockMvc(printOnlyOnFailure = false)
class MySlicedControllerTest {
  // ...
}

0

如果您正在测试控制器,您将无法获得由视图返回的JSon结果。您可以测试视图(或先测试控制器再测试视图),或者启动一个Servlet容器(例如使用Cargo),并在HTTP级别进行测试,这是检查实际发生情况的好方法。


实际上,您可以使用.andReturn()从控制器获取JSON响应。 - jax
哦,是的,没错,我刚看到你的回答里有这个。我不知道Spring提供了这么多的mocks,太棒了。 - funkygono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接