当前位置: 首页 > 知识库问答 >
问题:

Spring MVC测试中带过滤器的JsonPath表达式

汪欣德
2023-03-14

我有一个返回部分列表的控制器。这些部分中的每一个都有一个类型。我想测试类型“JOB”的部分是否有一个大小为3的字段“函数”。

这是我的代码:

mockMvc.perform(get(url)
        .contentType(MediaTypes.HAL_JSON)
        .accept(MediaTypes.HAL_JSON))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(jsonPath("$._embedded.content", 
                hasSize(equalTo(2))))
        .andExpect(jsonPath("$._embedded.content[?(@.type=='JOB')].functions", 
                hasSize(equalTo(3))));

控制器返回的JSON(为便于阅读而简化):

{
   "_embedded":{
      "content":[
         {
            "subsections":null,
            "type":"PROFILE",
            "createdDate":null,
            "lastModifiedDate":null
         },
         {
            "functions":[
               {
                  "rank":845131,
                  "function":"9IXZT"
               },
               {
                  "rank":82701,
                  "function":"T91WX"
               },
               {
                  "rank":98686,
                  "function":"PA7NA"
               }
            ],
            "type":"JOB",
            "createdDate":null,
            "lastModifiedDate":null
         }
      ]
   }
}

我用这个工具对JSON进行了测试,结果正确,但在运行测试时,我得到了以下断言错误:

java.lang.AssertionError: JSON path "$._embedded.content[?(@.type=='JOB')].functions"
Expected: a collection with size <3>
    but: collection size was <1>
        at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
        at org.springframework.test.util.JsonPathExpectationsHelper.assertValue(JsonPathExpectationsHelper.java:74)
        at org.springframework.test.web.servlet.result.JsonPathResultMatchers$1.match(JsonPathResultMatchers.java:86)
        at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171)
        ...

共有2个答案

子车俊哲
2023-03-14

在表达式的末尾添加.*解决了问题,所以现在看起来像这样:

$._embedded.content[?(@.type=='JOB')].functions.*

我不明白为什么示例中的第一个表达式有效,但我必须添加。*第二个。如果有人知道,请解释。

洪梓
2023-03-14

添加时会出现差异* 。当我在JSONPath Expression Tester中填写您的数据时,我得到了一个细微但重要的区别:

$_嵌入的内容[?(@.type=='JOB')]。函数

[
   [
      {
         "rank":845131,
         "function":"9IXZT"
      },
      {
         "rank":82701,
         "function":"T91WX"
      },
      {
         "rank":98686,
         "function":"PA7NA"
      }
   ]
]

和<代码>$_嵌入的内容[?(@.type=='JOB')]。功能* 收益率

[
   {
      "rank":845131,
      "function":"9IXZT"
   },
   {
      "rank":82701,
      "function":"T91WX"
   },
   {
      "rank":98686,
      "function":"PA7NA"
   }
]

因此,对于情况1,当您使用根节点(这是一个数组)时,您有一个元素作为直接子元素:包含三个对象的数组。因此断言找到了一个大小为1的数组(集合)。对于情况2,您有包含三个对象的数组根节点,从而导致集合的计数为三。

在这个例子中,我使用了Flow Communications下的JSONPath 0.3.4实现。

函数后面的.将结果的根级别设置为此元素,*表示将所有元素置于该根下。

我没有足够的信心来解释$._embedded.content [?( @.type=='JOB')]函数背后的确切行为。但是我认为这与过滤器有关?(@. type=='JOB')

https://github.com/json-path/JsonPath#what-is-returned-when

 类似资料:
  • 问题内容: 嘿,我想知道是否有人知道使用正则表达式或通配符(或SQL中的pehaps )的方式,以便可以使用JSONPath在大量JSON数据内进行搜索。 例如(是的,我正在解析,而不是在应用程序中读取数据): 我希望能够浏览这样的数据: 其中参数的内容是数据对中部分或全部值的一部分。 目前,我只找到文件上,,,和关系运算符,它不给我那么多的灵活性。 有谁知道一个方法可以让我只是 刚刚 JSONP

  • 过滤表达式 mitmproxy工具中的许多命令都使用过滤器表达式。过滤器表达式由以下运算符组成: 命令 描述 〜a 匹配响应资源:CSS,Javascript,Flash,images。 〜b regex Body 〜bq regex 请求的Body 〜bs regex 响应的Body 〜c int HTTP响应码 〜d regex 域名 〜dst regex 匹配目标地址 〜e 匹配错误 〜h

  • 问题内容: 我在为ElasticSearch Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for / media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press- release-1 。为了尝试正确使用我现在使用的正则表达式,但这最终将与用户的查询字符串一起使用。 POST到localhos

  • 22.13.3.测试过滤 从Gradle1.10开始,可以根据测试任务名进行特点的任务测试,过滤与在构建脚本的段落中引入/排除测试任务(-Dtest.single, test.include and friends)是两种不同的机制.后者是基于文件,如测试实现类的物理位置.选择文件级的测试会不支持那些被测试等级过滤掉的一些有趣的测试脚本.下面的这些有些已经被实现,有些是将来会实现的: 过滤特定等级

  • 我使用的是JAVA中的Jayway JsonPath 2.2版本。关于这一点,我几乎没有问题。 示例JSON: > 如: 用于获取字符串的路径是预期结果:(字符串),但获取["type2"](数组) 如果我将其作为字符串提取时出错,请更正路径? 应用筛选器后,无法为结果数组编制索引。我怎样才能达到同样的效果? 如: 如果我使用路径,而不是返回第一个,它将返回 是否可以使用jsonPath从字符串中

  • 本文向大家介绍AngularJS 单元测试过滤器,包括了AngularJS 单元测试过滤器的使用技巧和注意事项,需要的朋友参考一下 示例 过滤器代码: 考试: 跑! 备注:在inject测试的调用中,您的过滤器需要使用其名称+ Filter来指定。原因是,每当您为模块注册过滤器时,Angular都会Filter在其名称后面附加一个注册它。