Hamcrest close不能在RestAssured.body中工作

时间:2019-03-08 14:58:54

标签: groovy rest-assured hamcrest rest-assured-jsonpath

我进行了一次测试,无法正确获取语法:

@Test
void statsTest() {
    given().queryParam("param", "ball")
            .when().get()
            .then().body("total", is(closeTo(10.0, 0.1*10.0))));
}

但是,即使满足条件,测试仍会失败:

java.lang.AssertionError: 1 expectation failed.
JSON path total doesn't match.
Expected: is a numeric value within <1.0> of <10.0>
Actual: 10

RestAssuredHamcrest的此设置中,我从未遇到过类型问题。例如,进行以下测试:body("total", greaterThan(9))可以正常工作,这意味着引擎盖下有某种类型转换。

我已经浏览了文档,但是找不到将body("total")的值转换为数值的方法。 所以我怀疑这是一个错误,或者我在这里不了解某些内容。

这是JSON响应。我不得不剪短它。希望这行得通。

{
 "stats": {
 "totalHits": 1,
 "searchEngineTimeInMillis": 83,
 "searchEngineRoundTripTimeInMillis": 87,
 "searchProcessingTimeInMillis": 101
},
 "products": {
    "id": "total",
    "displayName": "Documents",
    "ball": 10}
}

2 个答案:

答案 0 :(得分:1)

您的响应中与键:“ total”相对应的键值对似乎是整数类型。因此,需要检查基于整数的界限(1,10)的界限。因此,您可以使用以下匹配器,而不是使用closeTo匹配器。

allOf(greaterThanOrEqualTo(1), lessThanOrEqualTo(10)))

答案 1 :(得分:1)

我整理了另一种解决问题的方法,但方法略有不同。非常感谢那些使用代码示例填充网络的人。以下假定您已经设置了基础URIPATH。您可以使用get("/path...")在响应中更深处添加路径。该答案假定为JSON类型的响应。

 private static Response getResponse(String paramName, String paramValue) {
    return given().queryParam(paramName, paramValue)
            .when().get();
}

 public static String getJsonValue(String jsonPath, String paramName, String paramValue) {
    Response response          = getResponse(paramName, paramValue);
    //response.getBody().prettyPrint();
    JsonPath jsonPathEvaluator = response.jsonPath();
    return jsonPathEvaluator.get(jsonPath).toString();
}

您可以简单地打印返回值并将其转换为所需的类型。 然后测试如下:

 public static void checkIfNumberCloseToValue(String jsonPath,
                                             String paramName,
                                             String paramValue,
                                             Double error,
                                             Double expected) {
    Double value = Double.valueOf(Utils.getJsonValue(jsonPath, paramName, paramValue));
    double range = expected * error;
    assertThat(value, closeTo(expected, range));
}