Будьте уверены: как мы можем сравнить каждый элемент в массиве Json с одним и тем же значением в Java, используя Hemcrest Matchers, без использования цикла Foreach

Будьте уверены: как мы можем сравнить каждый элемент в массиве Json с одним и тем же значением в Java, используя Hemcrest Matchers, а не используя цикл Foreach.

{
  "id": 52352,
  "name": "Great Apartments",
  "floorplans": [
    {
      "id": 5342622,
      "name": "THE STUDIO",
      "fpCustomAmenities": [
        {
          "displaySequence": 2,
          "amenityPartnerId": "gadasd",
          "display": true,
          "leased": true
        },
        {
          "displaySequence": 13,
          "amenityPartnerId": "sdfsfd",
          "display": true,
          "leased": true
        }
      ]
    },
    {
      "id": 4321020,
      "name": "THE First Bed",
      "fpCustomAmenities": [
        {
          "displaySequence": 4,
          "amenityPartnerId": "gadasd",
          "display": true,
          "leased": true
        },
        {
          "displaySequence": 15,
          "amenityPartnerId": "hsfdsdf",
          "display": true,
          "leased": true
        }
      ]
    }
  ]
}

Я хочу сравнить, что Leased = true для всех арендованных узлов на всех уровнях в ответе json ...

У меня рабочий код ...

List<List<Boolean>> displayedvaluesfpStandardAmenities =
        when().get(baseUrl + restUrl).
                then().statusCode(200).log().ifError().
                extract().body().jsonPath().getList("floorplans.fpCustomAmenities.display");

for (List<Boolean> displayedStandardList : displayedvaluesfpStandardAmenities) {
    for (Boolean isDisplayedTrue : displayedStandardList) {
        softAssert.assertTrue(isDisplayedTrue);
    }
}

Но проблема в том, что мне нужно, чтобы код был в простом формате с использованием либо Hemcrest Matchers, либо Restaussred Matchers, и попробуйте упрощенный способ, например, ниже (который не работает)

when().get(baseUrl + restUrl).
then().assertThat().body("floorplans.fpCustomAmenities.display",equalTo("true"));

Я получаю сообщение об ошибке

java.lang.AssertionError: 1 expectation failed.
JSON path floorplans.fpCustomAmenities.display doesn't match.
Expected: true
  Actual: <[[true, true], [true, true]]>

Итак, мне нужно, чтобы все узлы 'display' в ответе json, где бы это ни было необходимо, сравнивали с истинным, чтобы мой тест мог пройти.

У меня есть альтернативное решение, подобное упомянутому выше, но все, что мне нужно, - это рабочее решение с использованием сопоставителей.


person ravitorrents    schedule 20.01.2021    source источник
comment
Можете ли вы попробовать поместить ожидаемый результат в коллекцию List ‹List ‹boolean››, которая будет вашей коллекцией, и сравнить то же самое, угадайте, что должно работать. когда (). получить (baseUrl + restUrl). then (). assertThat (). body (floorplans.fpCustomA Удобства.display, equalTo (‹Collection›));   -  person Karan    schedule 06.02.2021


Ответы (1)


Предполагая, что массивы fpCustomAmenities не пусты, вы можете использовать следующее решение;

when().get(baseUrl + restUrl).then()
            .body("floorplans.findAll { it }.fpCustomAmenities" + // 1st line
             ".findAll { it }.leased.each{ a -> println a }" +  // 2nd line
            ".grep{ it.contains(false) }.size()", equalTo(0));  // 3rd line

Здесь из 1-й строки мы возвращаем каждый объект в массиве fpCustomAmenities.

Из второй строки мы получаем логическое значение leased в каждом объекте fpCustomAmenities в логический массив ([true, true]).

Каждый логический массив печатается из .each{ a -> println a }. Я добавил его только для объяснения ответа. Это не имеет отношения к решению.

Из 3-й строки мы проверяем, есть ли false в каждом логическом массиве. grep() вернет только массивы с false. И тогда мы получаем количество фильтрованных массивов. Затем проверяем, равно ли оно 0.

Дополнительные сведения см. В документации Groovy. .

Or

Это решение не использует никаких сопоставителей. Но это работает.

String responseBody = when().get(baseUrl + restUrl).
then().extract().response().getBody().asPrettyString();

Assert.assertFalse(responseBody.contains("\"leased\": false"));
person kaweesha    schedule 06.02.2021