我进行了一次测试,无法正确获取语法:
@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
在RestAssured
和Hamcrest
的此设置中,我从未遇到过类型问题。例如,进行以下测试:body("total", greaterThan(9))
可以正常工作,这意味着引擎盖下有某种类型转换。
我已经浏览了文档,但是找不到将body("total")
的值转换为数值的方法。
所以我怀疑这是一个错误,或者我在这里不了解某些内容。
这是JSON响应。我不得不剪短它。希望这行得通。
{
"stats": {
"totalHits": 1,
"searchEngineTimeInMillis": 83,
"searchEngineRoundTripTimeInMillis": 87,
"searchProcessingTimeInMillis": 101
},
"products": {
"id": "total",
"displayName": "Documents",
"ball": 10}
}
答案 0 :(得分:1)
您的响应中与键:“ total”相对应的键值对似乎是整数类型。因此,需要检查基于整数的界限(1,10)的界限。因此,您可以使用以下匹配器,而不是使用closeTo
匹配器。
allOf(greaterThanOrEqualTo(1), lessThanOrEqualTo(10)))
答案 1 :(得分:1)
我整理了另一种解决问题的方法,但方法略有不同。非常感谢那些使用代码示例填充网络的人。以下假定您已经设置了基础URI
和PATH
。您可以使用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));
}