如何使用Rest Assured验证JSON 2D阵列?

时间:2017-10-19 09:39:45

标签: java json rest api rest-assured

这是一个问题。

第1部分:

{
  "people": [
    {
      "name": "John",
      "address": "765 the the",
      "number": "3277772345",
    },
    {
      "name": "Lee",
      "address": "456 no where",
       "number": "7189875432",
    },  
  ]
}

我想验证号码字段,即号码是"7189875432""7189875432"的JSON路径为:people[1]. number(位于JSON数组中)。

要做到这一点,我做了同伴:

List<String> value=
given()
.when()
.get("/person")
.then()
.extract()
.path("people.findAll{it.number=='7189875432}. number");
 If (value.isEmpty)
            assert.fail(); 

此测试将通过。 基本上,如果值在那里,它将返回该值的列表。我明白了。但现在让我们说我有一个JSON,如:

第2部分

{
  "people": [
    {
      "name": "John",
      "address": "765 the the",
      "phoneno": [
        {
          "number": "3277772345",

        },
        {
          "number": "654787654",

        },

      ]
    },
    {
      "name": "Lee",
      "address": "456 no where",
      "phoneno": [
        {
          "number": "7189875432",

        },
        {
          "number": "8976542234",

        },
        {
          "number": "987654321",

        },

      ]
    },

  ]
}

现在我想验证电话号码"987654321"是否在JSON中。 JSON路径:people[1].phoneno[2].number

List<String> value=
given()
.when()
.get("/person")
.then()
.extract()
.path("people.phoneno.findAll{it.number=='987654321'}. number");
 If (value.isEmpty)
            assert.fail();

此测试将失败,因为它将返回一个空字符串。

如果我对路径进行硬编码:

.path("people[1].phoneno.findAll{it.number=='987654321'}. number");
 If (value.isEmpty)
            assert.fail(); // this test will pass

此外,如果我这样做

 .path("people.phoneno. number");
I would get a list such as [["987654321", "3277772345", "7189875432", "8976542234"]] 

包含JSON中所有数字的列表。

所以我的问题是我们如何验证在另一个数组中有数组的JSON路径?我不想硬编码任何东西。

注意:唯一可用的信息是数字,"987654321"

1 个答案:

答案 0 :(得分:1)

您始终可以编写自己的自定义匹配器:

private static Matcher<List<List<String>>> containsItem(String item) {
    return new TypeSafeDiagnosingMatcher<List<List<String>>>() {
      @Override
      protected boolean matchesSafely(List<List<String>> items, Description mismatchDescription) {
        return items.stream().flatMap(Collection::stream).collect(toList()).contains(item);
      }

      @Override
      public void describeTo(Description description) {
        description.appendText(
            String.format("(a two-dimensional collection containing \"%s\")", item));
      }
    };
  }

然后使用此匹配器:

given()
.when()
.get("/person")
.then()
.body("people.phoneno.number", containsItem("987654321"));

要使此匹配器更具可重用性,请使输入类型通用:
private static <T> Matcher<List<List<T>>> containsItem(T item) {...}