Hamcrest close Не работает в RestAssured.body () - PullRequest
1 голос
/ 08 марта 2019

У меня есть тест, который я не могу получить синтаксис правильно:

@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}
}

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Я собрал другой подход, который решает проблему, но с немного другим подходом.Большое спасибо тем, кто заполняет Интернет своими примерами кода.Далее предполагается, что вы уже установили базовые значения 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));
}
1 голос
/ 11 марта 2019

Пара ключ-значение, соответствующая ключу: "total" в вашем ответе, кажется, имеет целочисленный тип. Поэтому его необходимо проверить на наличие границ с целочисленными границами (1,10). Поэтому вместо использования сопоставителя closeTo вы можете использовать следующее сопоставление.

allOf(greaterThanOrEqualTo(1), lessThanOrEqualTo(10)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...