问题描述
在基于 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")));