RestAssured + Pojo (cannot be cast to class java.util.List)

Всем привет. Изучаю автотестирование API, Java + RestAssured. Предыдущее тесты имеют подобную структуру, и там все работает без ошибок. Если кто поможет решить данную проблему, буту ОЧЕНЬ благодарен!!

Проблема заключается в том, что при запуске теста получаю ошибку (java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class java.util.List (java.util.LinkedHashMap and java.util.List are in module java.base of loader ‘bootstrap’)
).

Имею такой JSON:
{
“data”: {
“id”: 2,
“name”: “fuchsia rose”,
“year”: 2001,
“color”: “#C74375”,
“pantone_value”: “17-2031”
},
“support”: {
“url”: “Reqres - A hosted REST-API ready to respond to your AJAX requests”,
“text”: “To keep ReqRes free, contributions towards server costs are appreciated!”
}
}

Из него сделал Pojo class:
public class Data{
private Integer id;
private String name;
private Integer year;
private String color;
private String pantone_value;
}

public class Support{
    private String url;
    private String text;
}

public class Root{
    private Data data;
    private Support support;
}

Код

public void singleResource(){
    List<UserData3> colorsData1 = given()
            .when()
            .get("api/unknown/2")
            .then().log().all()
            .extract().body().jsonPath().getList(".", UserData3.class);

   
}

У вас ответ LinkedHashMap а вы его пытаетесь взять как Лист.

getList нужен в тех случаях, когда ответ содержит коллекцию, то есть json начинается с [
если там один элемент то просто extract().body().as(имя класса.class)

1 лайк

Так ну поехали по частям, в респонсе совершенно верно прилетает Root class. У которого под капотом два объекта, Data и Support, просто объекта, не лист, не мапа.
Если рестАшшуредом надо вытащить часть JSON`ины, то концептуально верно это делать так:

        Data colorsData1 = given()
            .when()
            .get("api/unknown/2")
            .then().log().all()
            .extract()
            .body()
            .as(Root.class)
            .getData();

т.е. по сути сначала получаем полноценный root, а уже потом из него как из java объекта извлекаем всё что нам необходимо, в данном случае дата. Разумеется в этом случае надо либо на класс Root навесить метод getData() который вернёт this.data, либо аннотацию ломбока @Data (изза наличия класса Data, аннотация будет иметь вид @lombok.Data):

@lombok.Data
public class Root{
    private Data data;
    private Support support;
}