You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MockMvc测试:如何使用jsonPath验证返回数组中每个元素的name字段包含指定子串

如何用MockMvc验证JSON数组中所有元素的字段都包含指定子串?

这个问题我做接口测试时也踩过同款坑!你遇到的错误根源很清晰:$[*].name会返回一个JSON数组(就是报错里的net.minidev.json.JSONArray),但Matchers.containsString()是用来匹配单个字符串的,类型不匹配自然触发断言错误。

给你两种靠谱的解决方案:

方法一:用Hamcrest的everyItem匹配器(推荐)

这是最简洁的标准写法,直接借助Hamcrest提供的everyItem()遍历数组中的每一项,对每个元素的name字段应用包含判断:

mockMvc.perform(MockMvcRequestBuilders.get(uri) 
  .param("name", text) 
  .accept(MediaType.APPLICATION_JSON)) 
  .andDo(print()) 
  .andExpect(status().isOk()) 
  .andExpect(MockMvcResultMatchers.jsonPath("$[*].name", Matchers.everyItem(Matchers.containsString("div3"))));

everyItem()会自动检查数组里的每一个name值,确保它们都包含"div3"子串,完全贴合你的需求。

方法二:自定义ResultHandler手动验证

如果需要更复杂的验证逻辑(比如同时检查多个字段、添加自定义错误提示),可以用andDo()结合ResultHandler手动解析JSON并遍历验证:

mockMvc.perform(MockMvcRequestBuilders.get(uri) 
  .param("name", text) 
  .accept(MediaType.APPLICATION_JSON)) 
  .andDo(print()) 
  .andExpect(status().isOk())
  .andDo(result -> {
      // 取出响应的JSON字符串
      String jsonResponse = result.getResponse().getContentAsString();
      JSONArray jsonArray = new JSONArray(jsonResponse);
      // 遍历每个元素做验证
      for (int i = 0; i < jsonArray.length(); i++) {
          JSONObject item = jsonArray.getJSONObject(i);
          String name = item.getString("name");
          // 自定义断言,失败时会显示具体的错误信息
          Assert.assertTrue(String.format("第%d个元素的name不包含'div3':%s", i, name), 
                            name.contains("div3"));
      }
  });

这种方式灵活性更高,适合特殊场景下的验证需求。

内容的提问来源于stack exchange,提问作者badperson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:17:53