如何使用 Rest assured 验证数组中元素的正确值

How to validate correct values of elements inside arrays with Rest assured

我正在尝试验证我的响应的某些属性,如 rest assured tutorial 中所示。

问题是,当测试数组内的属性时,我可以像示例中那样验证它们是否出现,但不能验证它们是否与元素的其他属性匹配。

为了澄清,假设我有教程的回复(添加 "prize")

{
"lotto":{
 "lottoId":5,
 "winning-numbers":[2,45,34,23,7,5,3],
 "winners":[{
   "winnerId":23,
   "prize":5000,
   "numbers":[2,45,34,23,3,5]
 },{
   "winnerId":54,
   "prize":100000,
   "numbers":[52,3,12,11,18,22]
 }]
}
}

我可以验证 winnerIds 为 23 和 54

expect().
         body("lotto.lottoId", equalTo(5)).
         body("lotto.winners.winnderId", hasItems(23, 54)).
when().
       get("/lotto");

我可以验证奖品是 500 和 100000,但我无法验证 winnerId=23 的奖品是 500,winnerId=54 的奖品是 100000。响应将显示 winnerId=23,奖品=100000,测试将通过。

我无法使用 contains() because the elements in the array can come in any order, so I need to user containsInAnyOrder()

据我所知,Rest-Assured 只允许验证直接的值验证。对于条件验证,您必须改用 jsonpath:

$.lotto.winners.[?(@.winnerId==23)].prize

以上jsonpath搜索lotto下的winners数组,选择winnerId==23的数组项,然后获取奖品;

expect().
         body("$.lotto.winners.[?(@.winnerId==23)].prize", equalTo(5000)).
when().
       get("/lotto");

SO 中还有其他帖子可供您参考 here and here

试试这个 link

中的表达式

可以找到 JsonPath 表达式语法 here

使用 hamcrest,注意事项,获奖名单中的一项被视为地图。

@Test
void test() {

    expect()
            .body("lotto.lottoId", equalTo(5))
            .body("lotto.winners.", allOf(
                    hasWinner(23, 5000),
                    hasWinner(54, 100000)
            ))
            .when()
            .get("/lotto");
}

private Matcher<Iterable<? super Map<? extends String, ? extends Integer>>> hasWinner(int winnerId, int prize) {
    return hasItem(allOf(
            hasEntry(equalTo("winnerId"), equalTo(winnerId)),
            hasEntry(equalTo("prize"), equalTo(prize))
    ));
}