← Назад к вопросам

Как распаковать список ответов запроса через Rest Assured?

1.7 Middle🔥 251 комментариев
#API тестирование#Фреймворки тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как распаковать (deserialize) список ответов запроса через Rest Assured

Когда мы работаем с API, возвращающим список объектов (например, /api/users, /api/products), задача распаковки (или десериализации) этого списка в удобные для работы Java-объекты является ключевой для автоматизации тестирования. Rest Assured предоставляет несколько мощных и гибких способов для этого, в основном через интеграцию с библиотеками сериализации/десериализации, такие как Jackson, Gson или JSON-B.

Основные подходы к десериализации списка в Rest Assured

1. Использование метода .as() с указанием типа коллекции (Class<T[]> или ParameterizedTypeReference)

Это самый прямой способ, если в ответе API приходит JSON-массив объектов.

import io.restassured.RestAssured;
import io.restassured.response.Response;
import com.fasterxml.jackson.databind.ObjectMapper; // Пример с Jackson
import java.util.List;

// Предположим, у нас есть класс User
public class User {
    private int id;
    private String name;
    // конструкторы, геттеры, сеттеры
}

// Способ 1: Использование .as(Class<T[]>)
@Test
public void testDeserializeListUsingClassArray() {
    Response response = RestAssured.get("/api/users");
    
    // Десериализация JSON-массива в массив объектов User, затем преобразование в List
    User[] usersArray = response.as(User[].class);
    List<User> userList = Arrays.asList(usersArray);
    
    // Теперь можно работать со списком
    assertThat(userList.size()).isGreaterThan(0);
}

2. Использование TypeRef или ParameterizedTypeReference для сложных generics

Если нужно сразу получить List<User>, а не массив, можно использовать обходной путь через TypeRef.

import io.restassured.common.mapper.TypeRef;
import java.util.List;

@Test
public void testDeserializeListUsingTypeRef() {
    List<User> userList = RestAssured
        .given()
        .when()
        .get("/api/users")
        .then()
        .extract()
        .body()
        .as(new TypeRef<List<User>>() {}); // Важно: создание анонимного класса
    
    // userList теперь является List<User>
    assertThat(userList.get(0).getName()).isEqualTo("John Doe");
}

Этот метод внутренне использует Jackson или другую настроенную библиотеку для работы с параметризованными типами.

3. Использование .jsonPath().getList() для простого извлечения данных

Если не требуется полная десериализация в POJO-объекты, а нужно лишь извлечь определенные поля из списка, JsonPath — идеальный инструмент.

import io.restassured.path.json.JsonPath;
import java.util.List;

@Test
public void testExtractListWithJsonPath() {
    JsonPath jsonPath = RestAssured
        .get("/api/users")
        .jsonPath();
    
    // Извлечение списка всех имен пользователей
    List<String> allNames = jsonPath.getList("name");
    
    // Извлечение списка объектов (но они будут Maps, не POJO)
    List<Object> usersAsMaps = jsonPath.getList("$");
    
    // Для десериализации в POJO через JsonPath можно указать класс
    List<User> userList = jsonPath.getList("$", User.class);
    
    assertThat(allNames).contains("Alice");
}

4. Конфигурация Rest Assured для автоматической десериализации (ObjectMapper)

Если в проекте активно используется, например, Jackson, можно настроить Rest Assured на его использование глобально, что сделает десериализацию более удобной и согласованной.

import io.restassured.RestAssured;
import io.restassured.config.ObjectMapperConfig;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;

RestAssured.config = RestAssured.config()
    .objectMapperConfig(new ObjectMapperConfig()
        .jackson2ObjectMapperFactory((type, s) -> new ObjectMapper()));

// После такой конфигурации .as(new TypeRef<List<User>>() {}) будет работать напрямую с Jackson.

Ключевые моменты и лучшие практики

  • Выбор библиотеки: Rest Assured по умолчанию пытается использовать Jackson 2, если он есть в проекте. Если нет — Gson, затем JSON-B. Убедитесь, что нужная библиотека добавлена в зависимости (например, jackson-databind).
  • Совместимость модели: POJO-классы (например, User) должны иметь поля, совпадающие по именам (или через аннотации @JsonProperty) с ключами в JSON, и стандартные геттеры/сеттеры.
  • Обработка сложных структур: Если список содержит сложные вложенные объекты, убедитесь, что ваша модель POJO отражает эту структуру.
  • Извлечение и проверка: Часто десериализация является частью цепочки given()-when()-then(). В блоке then() можно сразу извлечь список для проверок.
List<User> users = RestAssured
    .given()
    .header("Authorization", "Bearer token")
    .when()
    .get("/api/users")
    .then()
    .statusCode(200)
    .extract()
    .body()
    .as(new TypeRef<List<User>>() {});

// Проверка свойств элементов списка
assertThat(users).extracting("id").contains(1, 2, 3);

Итог: Для распаковки списка ответов в Rest Assured наиболее чистым и типобезопасным способом является использование TypeRef (для List<POJO>) или JsonPath.getList("$", POJO.class). Эти методы позволяют превратить сырой JSON-ответ API в удобную для тестирования коллекцию Java-объектов, на которой можно выполнять разнообразные проверки с помощью AssertJ или Hamcrest, что является сутью эффективного тестирования API в автоматизации.