Rest Assured 响应 - 验证匹配相同路径的节点

时间:2021-07-09 12:15:22

标签: java rest-assured web-api-testing rest-assured-jsonpath

在我的测试中,有如下响应:

{
    "commands": [
        {
            "type": "com.our.identity.patch",
            "value": [
                {
                    "op": "add",
                    "path": "/claims/gTwfQubKEl4r",
                    "value": [
                        "vcvWxlsLKV35"
                    ]
                },
                {
                    "op": "add",
                    "path": "/claims/Jmq6zrG7LKoJ",
                    "value": [
                        "iiMQoOWKu2OI"
                    ]
                }
            ]
        }
    ]
}

其中 gTwfQubKEl4rvcvWxlsLKV35 是键值对。
Jmq6zrG7LKoJiiMQoOWKu2OI 键值对相同​​。
响应可以包含许多键值对。
我需要能够验证响应中是否存在某些键和值。
我使用 restassured java,所以我知道我可以使用 commands.value.path 之类的路径来获取密钥,并使用 commands.value.value 之类的路径来获取我编写的这些方法的值:

public String getValueFromResponseBody(Response res, String key){
    return res.body().jsonPath().getString(key);
}
public void validateParameterValueInResponseBodyEquals(Response res, String param, String expectedValue){
    String value = getValueFromResponseBody(res,param);
    Assert.assertEquals(value,expectedValue);
}

传递的 param 是响应中的参数路径,如 commands.value.path
但是我认为这会给我带来与传递的路径匹配的响应正文中的第一个节点,而我需要检查与该路径匹配的响应中的所有节点。
可能吗?

1 个答案:

答案 0 :(得分:1)

<块引用>

我认为这会给我带来响应正文中的第一个节点 匹配传递的路径,而我需要检查所有节点 在与该路径匹配的响应中

不,它得到所有匹配。由于commands节点和value节点都是数组,所以会产生一个list的list。

List<List<String>> lists = JsonPath.from(res).getList("commands.value.path");
[[/claims/gTwfQubKEl4r, /claims/Jmq6zrG7LKoJ]]

List<String> list = JsonPath.from(res).getList("commands[0].value.path")
[/claims/gTwfQubKEl4r, /claims/Jmq6zrG7LKoJ]

String str = JsonPath.from(res).getString("commands[0].value[0].path");
/claims/gTwfQubKEl4r

解决方案:

要在一个查询中获取所有 path,您只需要制作 List<List<String>> --> List<String>。您可以在流中尝试 flatMap 或使用其他方式。

List<List<String>> lists = JsonPath.from(res).getList("commands.value.path");
List<String> flat = lists.stream()
                .flatMap(List::stream)
                .collect(Collectors.toList());
flat.forEach(System.out::println);
/claims/gTwfQubKEl4r
/claims/Jmq6zrG7LKoJ

还有一个选择:

您可以使用 JsonPath (com.jayway.jsonpath.JsonPath)

List<String> list = JsonPath.read(res, "$..path");
list.forEach(System.out::println);
/claims/gTwfQubKEl4r
/claims/Jmq6zrG7LKoJ
相关问题