Hamcrest:如何在对象数组中找到一个项目?

问题描述

在基于 RestAssured 的集成测试中,我得到以下响应:

{
  "status": "UP","checks": [
    {
        "name": "boot-errors","status": "UP"
    },{
        "name": "server-state","status": "UP","data": {
            "value": "running"
        }
    },...

  ]
}

例如,我需要检查此响应包含“服务器状态”的天气。我这样做了:

.body("name",everyItem(hasItem("server-state")))

.body("checks",everyItem(hasItem("server-state")))

但都没有奏效,它们都使集成测试失败。 我怎样才能做到这一点 ?抱歉,我不懂 Hamcrest 匹配器语法,也找不到明确的文档。

非常感谢。

亲切的问候,

西摩

解决方法

我完成了那个疯狂的声明:

   Response resp = RestAssured.given()
    .accept(MediaType.APPLICATION_JSON)
    .when()
    .get(UriBuilder.fromPath("...")
    .scheme("http")
    .host(wildfly.getHost())
    .port(wildfly.getMappedPort(...))
    .build());
   Map<Object,Object> jsonResponse = resp.jsonPath().getMap("$");
   ArrayList<Object> checks = (ArrayList) jsonResponse.get("checks");
   assertThat(checks,hasItem(Map.of("name","server-state","status","UP")));

它有效,但它很丑陋。有谁知道如何简化它?

,

我找到了更好的方法:

  RestAssured.given()
  .accept(MediaType.APPLICATION_JSON)
  .when()
  .get(UriBuilder.fromPath("...")
    .scheme("http")
    .host(wildfly.getHost())
    .port(wildfly.getMappedPort(...))
    .build())
  .then()
  .assertThat().body("checks.name",anyOf(hasItem("server-state")));