我使用RestAssured和Hamcrest来编写一些集成测试。 一切都很好,直到我试图检查嵌套属性。
我的Json身体是:
{
"rows": [
{
"uid": "927e2362-babb-47cc-8406-d618b0e15b89",
"owner": "myself"
},
{
"uid": "6d39c473-d0bd-496e-be86-40917aa3af79",
"owner": "myself"
}
]
}
我的测试代码是这样的:
ValidatableResponse response = request.when().get(path).then();
response.statusCode(HttpStatus.SC_OK);
现在我尝试添加一项检查,检查所有行的属性owner
的值为我自己
我能想到的最好的是:
response.body("rows.owner", everyItem(is("myself")));
但我更倾向于使用匹配器Matchers.hasProperty("owner")
甚至HasPropertyWithValue.hasProperty("owner", is("myself")
我已经尝试了几种方法但没有运气:
List<Object> o = response.extract().jsonPath().get("rows");
assertThat(o, hasItem(hasProperty("owner")));
assertThat(o.get(0),Matchers.hasProperty(TestConstants.DOC_OWNER));
但我每次都会得到
预期:包含hasProperty的集合(&#34;所有者&#34;) 但是:没有&#34;所有者&#34; in&lt; {owner =我,uid = 927e2362-babb-47cc-8406-d618b0e15b89&gt;,no&#34; owner&#34;在 &lt; {owner =我,uid = 6d39c473-d0bd-496e-be86-40917aa3af79&gt;
我已经看过这个subjet,这解释了我最终会得到一个数组数组。但我看不出如何以最简单的方式做到这一点: - 检查我的列表中的每个项目是否具有&#34;所有者&#34; 的属性,并且其值始终为&#34;我自己&#34; (过滤器用于请求)
答案 0 :(得分:0)
考虑切换到Karate,因为对嵌套JSON(或XML)的'deep-equals'检查是核心功能,您不需要依赖于Hamcrest或其他任何东西。您还有一个match each
关键字,专为数组而设计:
* def data = { foo: [{ bar: 1, baz: 'a' }, { bar: 2, baz: 'b' }, { bar: 3, baz: 'c' }]}
* match each data.foo == { bar: '#number', baz: '#string' }