Циклический отклик SerenityRest в JAVA - PullRequest
1 голос
/ 31 мая 2019

Я пытаюсь получить счетчик всех моделей из объекта автомобилей, который является частью ответа SerenityRest.

Response response = SerenityRest.rest()
        .contentType("application/json")
        .when()
        .get("/api/");
if (response.statusCode() == 200) {
   int numUniqueModels = response.body().path("cars.size()");  // 3
}

Ответ:

   "cars": {
       "Acura": [
           "ILX",
           "MDX",
           "TLX"
       ],
       "Audi": [
           "A3",
           "A4",
           "A6",
           "A7"
       ],
       "BMW": [
           "x",
           "y"
       ]
   }

Например,

response.body().path("cars.size()") = 3,

но мне нужна сумма cars.Acura.size () + cars.Audi.size () + cars.BMW.size (), чтобы получить все модели. Тем не менее, я не знаю, будут ли в ответе точные названия Acura, Audi или BMW, поскольку автомобили могут меняться динамически. Чтобы решить эту проблему, мне нужно сделать какой-то цикл, где:

sum = 0; 
for (int i = 0; i < response.body().path("cars.size()"); i++) {
   sum += response.body().path("cars.[i].size()");
}

В сумме должно быть указано общее количество моделей автомобилей = 9. Проблема в том, что этот синтаксис: путь («cars. [I] .size ()») не является правильным. Какой правильный звонок?

1 Ответ

1 голос
/ 31 мая 2019

Если вы хотите сделать сложный запрос с уверенностью, вы должны следовать синтаксису, описанному здесь groovy gpath , как упомянуто здесь спокойный документ :

Обратите внимание, что реализация JsonPath использует синтаксис Groathy GPath и его не следует путать с реализацией JsonPath Jayway.

Итак, вы должны поиграть с каким-нибудь классным синтаксом:

int total = JsonPath.from("{  "
              + " \"cars\": {\n"
              + "       \"Acura\": [\n"
              + "           \"ILX\",\n"
              + "           \"MDX\",\n"
              + "           \"TLX\"\n"
              + "       ],\n"
              + "       \"Audi\": [\n"
              + "           \"A3\",\n"
              + "           \"A4\",\n"
              + "           \"A6\",\n"
              + "           \"A7\"\n"
              + "       ],\n"
              + "       \"BMW\": [\n"
              + "           \"x\",\n"
              + "           \"y\"\n"
              + "       ]\n"
              + "   }"
              + "}")
        .getInt("cars.collect { it.value.size() }.sum()")

Так что это выражение должно сделать работу cars.collect { it.value.size() }.sum(). Метод collect подобен методу карты в функциональном программировании. Таким образом, вы отображаете коллекцию cars HashMap с size() ее значениями, и вы собираете sum()!

Редактировать

Так что вам просто нужно сделать:

Response response = SerenityRest.rest()
        .contentType("application/json")
        .when()
        .get("/api/");
if (response.statusCode() == 200) {
   int numUniqueModels = response.body().path("cars.collect { it.value.size() }.sum()");  // 9
}
...