gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:14:39 26 4
gpt4 key购买 nike

我有一个返回部分列表的 Controller 。每个部分都有一个类型。我想测试“JOB”类型的部分是否有一个大小为 3 的“functions”字段。

这是我的代码:

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))));

Controller 返回的 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
}
]
}
}

我用 this tool 测试了表达式针对该 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)
...

最佳答案

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

案例1

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

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

案例2

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

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

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

也许对于其他实现来说情况并非如此。在此示例中,我使用了流通信下的JSONPath 0.3.4实现。

<小时/>

functions 之后的 . 将结果的根级别设置为此元素,* 表示获取所有元素 在此根目录下。

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

有关

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

关于java - Spring MVC 测试中带有过滤器的 JsonPath 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com