Найти конкретную пару ключ-значение в массиве объекта с уверенностью - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть ответ json что-то вроде этого:

"someArray": [
    {
       "someProperty":"someValue",
       // other properties that are not relevant for me
    },
    {
       "someProperty":"someOtherValue",
       // other properties that are not relevant for me
    }
]

Я хочу проверить, есть ли в массиве someArray объект со свойством с именем "someProperty" со значением "someValue", но непровалите тест, если у него есть другой объект с тем же свойством, но не с тем же значением.

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

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Вот решение с использованием JsonPath:

List<String> values = RestAssured.when().get("/api")
    .then().extract().jsonPath()
    .getList("someArray.someProperty");

Assert.assertTrue(values.contains("someValue"));

Будет работать для следующего ответа JSON:

{  
   "someArray":[  
      {  
         "someProperty":"someValue"
      },
      {  
         "someProperty":"someOtherValue"
      }
   ]
}
0 голосов
/ 09 апреля 2019

Предполагая, что вы используете Java 8 или выше, вы должны использовать Arrays.stream(someArray), а затем использовать метод filter для выбора элементов, которые вы хотите.

Я не пользовался REST-гарантией, но, основываясь на их документации, похоже, что вы должны быть в состоянии использовать что-то подобное ниже

@Test public void
lotto_resource_returns_200_with_expected_id_and_winners() {

    when().
            get("/lotto/{id}", 5).
    then().
            statusCode(200).
            body("someArray", hasItems(hasEntry("someProperty", "someValue")));

}

Это работает, если вы можете использовать некую логику десериализации для преобразования объекта в карту перед использованием hasEntry

Другое решение заключается в использовании findAll body("someArray.findAll {o -> o.someProperty == 'someValue'}.size()", greaterThan(0))

...