RestAssured检查数组属性中嵌套的attribut

时间:2018-01-03 10:19:05

标签: rest integration-testing rest-assured hamcrest

我使用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; (过滤器用于请求)

1 个答案:

答案 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' }