Spring测试新手提问:能否将MockMvc返回结果转为Java Map?
当然可以!把MockMvc响应转成Java Map的方法
作为Spring测试的新手,你完全可以把MockMvc执行请求后的返回结果转换成Java Map,甚至是更复杂的集合类型。下面我结合你的测试代码,一步步教你实现:
核心思路
MockMvc允许你通过.andReturn()获取请求的完整结果(MvcResult),然后提取出响应体的JSON字符串,再用Jackson的ObjectMapper将JSON解析成Java Map(或List<Map>,因为你的返回是一个数组)。
改造后的完整测试代码
@Test public void readBookmarks() throws Exception { // 1. 执行请求并获取MvcResult对象 MvcResult mvcResult = mockMvc.perform(get("/" + userName + "/bookmarks")) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$", hasSize(2))) .andExpect(jsonPath("$[0].id", is(this.bookmarkList.get(0).getId().intValue()))) .andExpect(jsonPath("$[0].uri", is("http://bookmark.com/1/" + userName))) .andReturn(); // 关键一步:获取完整的请求结果 // 2. 从MvcResult中提取响应体的JSON字符串 String responseJson = mvcResult.getResponse().getContentAsString(); // 3. 用Jackson的ObjectMapper将JSON转成List<Map>(因为返回的是数组) ObjectMapper objectMapper = new ObjectMapper(); List<Map<String, Object>> bookmarkMapList = objectMapper.readValue( responseJson, new TypeReference<List<Map<String, Object>>>() {} ); // 4. 现在就可以直接操作Map来做验证或其他逻辑了 Map<String, Object> firstBookmark = bookmarkMapList.get(0); assert firstBookmark.get("id").equals(this.bookmarkList.get(0).getId().intValue()); assert firstBookmark.get("uri").equals("http://bookmark.com/1/" + userName); }
额外优化提示
- 如果你用的是Spring Boot测试,可以直接注入
ObjectMapper,不用手动new,更符合Spring的最佳实践:@Autowired private ObjectMapper objectMapper; - 如果你的接口返回的是单个JSON对象(不是数组),直接转成
Map<String, Object>即可,把TypeReference换成new TypeReference<Map<String, Object>>() {}。 - 确保你的项目里已经包含Jackson依赖(Spring Boot的
spring-boot-starter-web默认已经包含了,所以不用额外加)。
这样你就能轻松把MockMvc的响应转换成Java Map,方便后续的自定义验证或逻辑处理啦!
内容的提问来源于stack exchange,提问作者JavaCodeNet
相关产品推荐
相关产品推荐

