Как проверить правильность значений элементов в массивах с уверенностью

Я пытаюсь проверить некоторые свойства моего ответа, как показано в уверенном учебнике.

Проблема заключается в том, что при тестировании свойств внутри массива я могу проверить, как в примере, что они появляются, но не то, что они соответствуют другим свойствам элемента, как они должны.

Чтобы уточнить, скажем, у меня есть ответ из учебника (добавлен "приз")

{
"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(), потому что элементы в массиве могут располагаться в любом порядке, поэтому мне нужно, чтобы пользователь containsInAnyOrder ().

1 ответ

Решение

Насколько я знаю, Rest-Assured позволяет проверять только прямое подтверждение. Для условной проверки вы должны использовать вместо этого jsonpath:

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

Выше jsonpath ищет winners массив под lotto и выбирает элемент массива, который имеет winnerId==23 и затем получает приз;

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

Есть другие посты в SO, на которые вы можете ссылаться, здесь и здесь.

Попробуйте выражение в этой ссылке

Синтаксис выражения JsonPath можно найти здесь.

Используя 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))
    ));
}
Другие вопросы по тегам