Повторять и проверять значения в массиве Json в ответе RestAssured - PullRequest
0 голосов
/ 09 марта 2020

У меня есть ответ «Гарантированный покой», который содержит следующее тело:

{
   "content":[
      {
         "id":"7db80896",
         "secondaryId":"12F9BD",
         "version":1,
         "details":{
            "status":"VALID",
            "reason":"Passed validations"
         },
         "subscriptionStatuses":[
            {
               "subscriptionId":"b8003508",
               "subscriptionName":"Sub_1",
               "creator":"Person 1",
               "details":{
                  "status":"ACCEPTED",
                  "reason":"Passed validations"
               }
            },
            {
               "subscriptionId":"b8003509",
               "subscriptionName":"Sub_2",
               "creator":"Person 1",
               "details":{
                  "status":"ACCEPTED",
                  "reason":"Passed validations"
               }
            }
         ]
      },
      {
         "id":"7db80895",
         "secondaryId":"11F9BD",
         "version":1,
         "details":{
            "status":"VALID",
            "reason":"Passed validations"
         },
         "subscriptionStatuses":[
            {
               "subscriptionId":"b8003509",
               "subscriptionName":"Sub_2",
               "creator":"Person 2",
               "details":{
                  "status":"ACCEPTED",
                  "reason":"Passed validations"
               }
            }
         ]
      }
   ]
}

Я хочу проверить состояние «ПРИНЯТО» и причину «ПРОЙДЕННЫЕ ВАЛИДАЦИИ», которая вложена в 2 массива. Я попытался сохранить причины в виде списка, описанного в этом примере , но получаю следующую ошибку:

код: var list: List<Any> = response.jsonPath().getList("reason")

ошибка: java.lang.IllegalStateException: response.jsonPath().getList("reason") must not be null

Есть ли способ сделать:

for obj in response:
   for obj2 in obj.subscriptionStatuses:
      assertThat(obj2.status == expected)
      assertThat(obj2.reason == expected)

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Вы можете получить его, используя следующий код

List<String> m1 =response.jsonPath().get("content.subscriptionStatuses.details");
System.out.println(m1);

Вывод покажет [[{status = ACCEPTED, причина = пройденные проверки}, {status = ПРИНЯТО, причина = пройденные проверки}], [{ status = ACCEPTED, причина = пройденные проверки}]]

0 голосов
/ 09 марта 2020

Есть способ: десериализовать ответ на объекты. Создайте классы, соответствующие ответу.

например,

class Status {

  private String id;
  private String secondaryId;
  //etc.
  private StatusDetail details;
  private List<SubscriptionStatus> subscriptionStatuses;
}

... и так далее. Я не знаю, как это выглядело бы конкретно в Kotlin, но это было бы похоже.

Обратите внимание, что вложенные объекты в ответе JSON являются их собственными классами, а имена полей в каждом класс должен соответствовать именам полей в вашем JSON.

Затем вы можете использовать ObjectMapper для десериализации. Возможно, вам сначала потребуется сделать response.jsonPath().getList("$.content"), но я не знаю, каков ваш объект ответа, чтобы дать больше рекомендаций, чем это. Желательно, чтобы вы просто получили строку JSON напрямую:

List<Status> statuses = new ObjectMapper().readValue(jsonString, 
  new TypeReference<List<Status>>() {})

Обратите внимание, что вы можете повторно использовать ObjectMapper и не следует каждый раз создавать новую, и есть варианты для ObjectMapper, а также разрешить нулевые значения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...