我正在尝试编写一个 JUnit 测试,它检查接收到的 JSON 的值。我使用 jsonPath 访问 JSON 中的这些值。我想检查一个值是否为
true
。对于简单的 jsonPaths,它对我有用,但是当我编写更复杂的 jsonPath 查询时,它不起作用,并且我收到此断言错误:
Expected: is <true>
but: was <[true]>
我的JSON:
{...
,"trips":
[
{...
,"employee":{"name":"Ordinary Joe","login":"joe","contractor":true}
,...
},
...
],
...
}
有问题的断言
.andExpect(jsonPath("$.trips[?(@.employee.login=='joe')].employee.contractor", is(true)));
我尝试过的
我尝试将该值也与
new Boolean(true)
、boolean[]
数组与一个 true
值进行匹配,并且在检查 is()
匹配器后也与 String.valueOf(true)
但它也不匹配。
我的问题
我应该如何正确匹配这个
true
值?这些 []
大括号在测试输出中到底意味着什么?
在进一步的调查中,我实际上发现 jsonPath 以某种方式将获得的
true
值转换为具有一项的 JsonArray
,因此不可能将其与 is(true)
匹配器匹配。我不知道为什么 JsonPath 这样做。
我发现使用
hasItem
匹配器代替以下工作解决方法:
.andExpect(jsonPath("$.trips[?(@.employee.login=='joe')].employee.contractor", hasItem(true)))
.andExpect(jsonPath("$.trips[?(@.employee.login=='joe')].employee.contractor", not(hasItem(false))))
您可以使用 ==0 表示 true 或 ==1 表示 false
{
MyArray: [
{
IsTrueOrFalse: true,
Item: "1st Item"
},
{
IsTrueOrFalse: false,
Item: "2nd Item"
}
]
}
$..MyArray[?(@.CheckIfTrueOrFalse==0)].Item 返回 [“第一项”]