RestAssured: Как проверить длину ответа массива json?

У меня есть конечная точка, которая возвращает JSON как:

[
  {"id" : 4, "name" : "Name4"},
  {"id" : 5, "name" : "Name5"}
]

и класс DTO:

public class FooDto {
    public int id;
    public String name;
}

Теперь я тестирую длину возвращаемого массива json следующим образом:

@Test
public void test() {
    FooDto[] foos = RestAssured.get("/foos").as(FooDto[].class);
    assertThat(foos.length, is(2));
}

Но есть ли способ сделать это без добавления в массив FooDto? Что-то вроде этого:

@Test
public void test() {
    RestAssured.get("/foos").then().assertThat()
      .length(2);
}

Ответ 1

Решено! Я решил это так:

@Test
public void test() {
    RestAssured.get("/foos").then().assertThat()
      .body("size()", is(2));
}

Ответ 2

Есть способы. Я решил с помощью ниже

@Test
public void test() {
 ValidatableResponse response = given().when().get("/foos").then();
 response.statusCode(200);
 assertThat(response.extract().jsonPath().getList("$").size(), equalTo(2));
}

с использованием restassured 3.0.0

Ответ 3

Я решил аналогичную задачу с GPath.

Response response = requestSpec
                .when()
                .get("/new_lesson")
                .then()
                .spec(responseSpec).extract().response();

Теперь я могу извлечь тело ответа как String и использовать встроенные возможности GPath

String responseBodyString = response.getBody().asString();

assertThat(from(responseBodyString).getList("$").size()).isEqualTo(YOUR_EXPECTED_SIZE_VALUE);
assertThat(from(responseBodyString).getList("findAll { it.name == 'Name4' }").size()).isEqualTo(YOUR_EXPECTED_SUB_SIZE_VALUE);

В качестве полного примера см. http://olyv-qa.blogspot.com/2017/07/restassured-short-example.html

Ответ 4

@Эктор

[   
   {"id" : 4, "name" : "Name4"}, 
   {"id" : 5, "name" : "Name5"}
]

Это был действительно неудачный пример. Здесь у вас есть матрица [2,2].

Если вы создаете что-то вроде этого:

[   
   {"id" : 4, "name" : "Name4"}, 
   {"id" : 5, "name" : "Name5"}, 
   {"id" : 6, "name" : "Name6"} 
]

Теперь вы все еще пройдете тестирование:

@Test
public void test() {
    RestAssured.get("/foos").then().assertThat()
      .body("size()", is(2));
}

Подумайте, было ли это намеренно. body("size()",is(2)); представляет body("size()",is(2)); Имейте проверку длины одного узла вместо количества записей в ответе.

Ответ 5

Это то, что вам нужно сделать, чтобы получить размер.

Response response = 
given()
.header("Accept","application/json")
.when()
.get("/api/nameofresource")
.then()
.extract()
.response();

Получив ответ, вы можете сделать следующее, чтобы получить размер.

int size = response.jsonPath(). getList ("id"). size();

надеюсь это поможет. :)