【问题标题】:Hamcrest: how to find an item in an array of objects?Hamcrest:如何在对象数组中找到一个项目?
【发布时间】:2026-02-08 03:25:01
【问题描述】:

在基于 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 匹配器语法,也没有找到明确的文档。

非常感谢。

亲切的问候,

西摩

【问题讨论】:

    标签: matcher hamcrest rest-assured-jsonpath


    【解决方案1】:

    我找到了更好的方法:

      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")));
    

    【讨论】:

      【解决方案2】:

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

         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")));
      

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

      【讨论】:

        最近更新 更多