Возможно, есть несколько способов, но я хочу представить конкретный, используя только RestAssured
.
Во-первых, вы можете создать классы Java для представления данного JSON. Вы всегда можете расширить его.
Создать класс ResultsObject
(имя не имеет значения)
public class ResultsObject {
public List<TypeObject> results;
}
Мы заявляем, что RestAssured
должен искать массив JSON объектов JSON. Каждый из этих объектов анализируется на TypeObject
(это имя также не имеет значения). Что имеет значение, так это results
имя переменной. Это соответствует results
в JSON.
Итак, теперь нам нужно создать класс TypeObject
для представления каждого из объектов JSON.
public class TypeObject {
public String type;
}
Опять же, имя класса не имеет значения, важно type
имя переменной. Как в JSON.
Теперь, с помощью единственной строки кода мы можем проанализировать JSON (либо из Response
, либо String
) с классами, которые мы создали, так:
ResultsObject results = response.jsonPath().get("$", ResultObject.class);
Для создания утверждения требуется дополнительная работа.
MatcherAssert.assertThat(types, Matchers.hasItems("AAAA", "A")); //you can use static imports if you'd like.
Утверждение от Hamcrest
, которое уже включено в RestAssured
. Он сопоставляет массив строк с массивом строк по нашему выбору.
Вы можете заметить, что types
еще не инициализирован. Нам нужен массив строк, но это массив TypeObject
. Мы можем просто преобразовать его, используя Java Stream API
, например так:
List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
И это все!
Но, кстати, если вы получите Исключение, подобное этому Cannot deserialize object because no JSON deserializer found in classpath. Please put either Jackson (Databind) or Gson in the classpath.
, все, что вам нужно сделать, это добавить jackson-databind
в Maven. Rest Assured может использовать привязку данных Gson
или Jackson
для преобразования JSON в классы Java.
Все, что вам нужно, это зависимость, и все готово.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
Я уже тестировал решение.
Это также дает вам гибкость в том, как вы хотите обрабатывать данные, и, как вы можете видеть, я использовал только 1 утверждение для сравнения всех type
s из JSON.
Надеюсь, это поможет!