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

Построение тестового фреймвоврка REST API

java
Теги: #<Tag:0x00007f9c574538c8>

(Andy Ant) #1

Есть JSON запрос который состоит из шапки и раздела с данными. Например:

{
“field”:“value”,

“data”:{
“field”:“value”,

}
}

Раздел “data” содержит специфические данные для каждой транзакции . Шапка присутствует в каждой транзакции. При десерилизации если использовать POJO запрос разбивается на 2 класса. Класс шапки и класс транзакции. Как использовать класс шапки для всех транзакций? Сейчас я использую патерн Builder и в классе шапки прописываю конструктор для объекта каждой транзакции . Хочется более изящное решение проблемы.


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

Я встречал похожую задачу, когда работал с сокетами. В каждом сообщении приходил event (строка) и data (объект). От event’а зависело, какого типа объект в data

public class WebSocketIncomingMessage<T> {
    private String event;
    private String dataAsString;
    private Class<T> type;
    private T data;

    public WebSocketIncomingMessage(String str) throws IOException {
        JsonNode root = new ObjectMapper().readTree(str);
        event = root.get("event").textValue();
        dataAsString = root.get("data").toString();
    }

    public T getData() throws IOException {
        if (data == null) {
            this.data = new ObjectMapper().readValue(dataAsString, type);
        }
        return data;
    }

    public void setType(Class<T> type) {
        this.type = type;
    }

    public String getEvent() {
        return event;
    }

    public Class<T> getType() {
        return type;
    }

    @Override
    public String toString() {
        return "WebSocketIncomingMessage{" +
                "event='" + event + '\'' +
                ", type=" + type +
                ", dataAsString='" + dataAsString + '\'' +
                '}';
    }
}

Вот WebSocketIncomingMessage - это общий для всех сообщений класс.
В зависимости от event, определяется type (в моем случае, event’ы совпадают с именами классов, так удобнее выводить нужный тип данных). И вот к этому type приводится dataAsString (см метод getData())

Посмотрите, может, есть что-то, что вам поможет