Будьте уверены: нет ли лучшего способа проверить массив результатов? - PullRequest
1 голос
/ 18 июня 2019

Я сейчас изучаю платформу Rest Assured.

Используя какой-то API, я получаю следующий (частичный) ответ JSON:

{
    "results": [
        {
            "type": "AAAA"
        },
        {
            "type": "A"
        }
    ]
}

Я пытаюсь проверить типы.Единственный способ, который я нашел до сих пор, - это использовать gson для преобразования строки в объект и затем утверждать:

@Given("^test2$")
public void test2$() {

    RestAssured.baseURI = BASE_URI;

    String response =
            given()
            .param(KEY_KEY, API_KEY)
            .param(URL_KEY, URL_TO_CHECK)
            .when()
            .get(RESOURCE)
            .asString();

    System.out.println(response);

    GsonBuilder builder = new GsonBuilder();
    builder.setPrettyPrinting();
    Gson gson = builder.create();
    WhtResponse whtResponse = gson.fromJson(response, WhtResponse.class);

    assertTrue(whtResponse.getResults().size() == 2);
    assertTrue(whtResponse.getResults().get(0).getType().equals("AAAA"));
    assertTrue(whtResponse.getResults().get(1).getType().equals("A"));
}

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

Есть ли лучший, более короткий и более быстрый способ проверить оба значения?Может быть, напрямую с гарантией и без Gson?

Спасибо!

1 Ответ

1 голос
/ 18 июня 2019

Возможно, есть несколько способов, но я хочу представить конкретный, используя только 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.

Надеюсь, это поможет!

...