t.me/atinfo_chat Telegram группа по автоматизации тестирования

REST API. Правильная передача POJO object как json-body

rest-assured
java
json
restapi
Теги: #<Tag:0x00007f9c50095d00> #<Tag:0x00007f9c50095bc0> #<Tag:0x00007f9c50095a58> #<Tag:0x00007f9c500958f0>

(Александр Викторович) #1

Добрый вечер, коллеги!

В автотесте апи-приложения есть ресурс, который в теле запроса принимает json-структуру.
Автотесты пишутся с помощью библиотеки rest assured. Т.к. методы фрейма позволяют работать с запросом как с объектом - для передачи этой json-структуры был сформирован pojo объект.
Он включает примитивные типы данных(например, id) и объекты.
Итого, при передаче в теле запроса моего pojo - все неустановленные мной значения для примитивных типов данных по дефолту устанавливаются как 0 (если говорить про целый тип), что в принципе логично, исходя из языка.
Но не все параметры обязательны в методе и соответственно не всегда нужно передавать значения для них.
Как можно избежать передачи установленных по-умолчанию значений для примитивных типов.

Пример:

@Test
    public void testForAtInfo() {
        RequestSpecification request = RestAssured.given();
        WeatherRequest body = new WeatherRequest();
        request.contentType(ContentType.JSON);
        body.setBase("Test");
        body.setId(321);
        request.body(body, ObjectMapperType.GSON)
                .post("http://host:port/weather").then().assertThat().statusCode(201)
                .log().all();
    }

Лог:
{
“visibility”: 0,
“cod”: 0,
“id”: 321,
“base”: “Test”
}
В логе видно, что кроме установленных мной id и base передаются присутствующие в структуре “visibility”: 0,
"cod": 0,


(Михаил Братухин) #2

Не использовать примитивные типы? Вместо них указать классы-обертки?


(Дмитрий Еремин) #3

Попробуйте в классе WeatherRequest полям visibility и cod выставить
@Expose(serialize = false)

Ну а для себя, пробежать глазами по статье: http://www.javacreed.com/gson-annotations-example/


(Vadim Shubkin) #4

Я так понимаю вам это надо:


(Михаил Братухин) #5

Не очень понимаю зачем так делать. Если значение может отсутствовать, то значит там ссылочный тип, а не простой. Проще сделать нормальный POJO с оберткой вместо простого типа.


(Александр Викторович) #6

К сожалению, так не работает. Эти поля становятся transient и при их инициализации они не сериализуются в json.

За статью спасибо, познавательно.


(Александр Викторович) #7

Так работает. Спасибо :wink: