放心地在对象数组中查找特定的键值对

Find specific key-value pair in an array of object with rest assured

我有一个 json 回复是这样的:

"someArray": [
    {
       "someProperty":"someValue",
       // other properties that are not relevant for me
    },
    {
       "someProperty":"someOtherValue",
       // other properties that are not relevant for me
    }
]

我想检查 someArray 数组是否有一个名为 "someProperty" 且值为 "someValue" 的 属性 对象,但如果它有另一个对象,则测试不会失败具有相同的 属性 但不同的值。

可能吗?在此之前我一直在使用静态索引,因为我在那个数组中只有一个元素。

假设您使用的是 Java 8 或更高版本,您应该使用 Arrays.stream(someArray) 然后使用 filter 方法来 select 您想要的元素。

我没有使用过 REST-assured,但根据他们的文档,您应该可以使用下面这样的东西

@Test public void
lotto_resource_returns_200_with_expected_id_and_winners() {

    when().
            get("/lotto/{id}", 5).
    then().
            statusCode(200).
            body("someArray", hasItems(hasEntry("someProperty", "someValue")));

}

如果您可以在使用 hasEntry

之前放置某种反序列化逻辑将对象转换为映射,则此方法有效

另一个解决方案是使用 findAll body("someArray.findAll {o -> o.someProperty == 'someValue'}.size()", greaterThan(0))

这是一个使用 JsonPath 的解决方案:

List<String> values = RestAssured.when().get("/api")
    .then().extract().jsonPath()
    .getList("someArray.someProperty");

Assert.assertTrue(values.contains("someValue"));

将适用于以下响应 JSON:

{  
   "someArray":[  
      {  
         "someProperty":"someValue"
      },
      {  
         "someProperty":"someOtherValue"
      }
   ]
}