Джексон: Частично обновить бин с json String - PullRequest
0 голосов
/ 10 февраля 2020

Я пишу набор тестов, который включает пинг API с различной полезной нагрузкой. Ниже приведен пример полезной нагрузки (пример):

{
   "param_1" : "value_1",
   "param_2" : "value_2",
   "param_3" : "value_3",
   "param_4" : "value_4",
   "param_5" : "value_5",
   "location" : {
        "region" : "EU"
   },
   "additional_params" : {
        "availability" : "high",
        "volume" : "low"
   }
}

У меня есть вышеуказанная полезная нагрузка, записанная в файле json, и набор тестов выполняет следующее:

  • Чтение json файл и создание компонента для полезной нагрузки
  • Отправка POST запроса
  • Утверждение ответа

Теперь мне нужно протестировать один и тот же API с различными комбинациями значений, например, регион США, низкая доступность, низкий объем и т. д. c. В запросе много других параметров, но меняются только вышеперечисленные. Чтобы проверить это, я могу сделать следующее:

  • Создать файл json с каждым сценарием
  • Создать только один файл json, десериализовать его и сохранить комбинации в другом файл, подобный этому:
[
  {
    "location": {
        "region": "US"
    },
    "additional_params" : {
        "availability" : "high",
        "volume" : "high"
    }
  },
  {
    "location": {
        "region": "EU"
    },
    "additional_params" : {
        "availability" : "low",
        "volume" : "low"
    }
  }
]

Затем я могу прочитать этот файл, обновлять базовый объект каждый раз перед отправкой запроса.

Проблема с первым подходом заключается в том, что я буду в конечном итоге с большим количеством файлов с 90% дублирующимся контентом. Для второго подхода предоставляет ли Джексон API для десериализации базового объекта и применяет изменения, как я упоминал выше?

1 Ответ

0 голосов
/ 10 февраля 2020

Для второго подхода предоставляет ли Джексон API для десериализации базового объекта и применяет изменения, как я упоминал выше?

Что ж, Джексон предоставляет что-то, что может быть полезно для вас. Я не знаю точно, как вы структурируете свои тесты, но одним из возможных подходов может быть использование @JacksonInject, так как это позволяет вводить значение в ваш бин.

Вы можете Определите классы моделей следующим образом:

@Data
public class Payload {

    private Location location;

    @JsonProperty("additional_params")
    private AdditionalParameters additionalParameters;
}
@Data
public class Location {

    @JacksonInject("region")
    private String region;
}
@Data
public class AdditionalParameters {

    @JacksonInject("availability")
    private String availability;

    @JacksonInject("volume")
    private String volume;
}

Тогда вы можете использовать:

String json = "{\n"
        + "    \"location\": {},\n"
        + "    \"additional_params\": {}\n"
        + "  }";

ObjectMapper mapper = new ObjectMapper();
mapper.setInjectableValues(new InjectableValues.Std()
        .addValue("region", "EU")
        .addValue("availability", "high")
        .addValue("volume", "low")
);

Payload payload = mapper.readValue(json, Payload.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...