RestAssured:如何检查 json 数组响应的长度?

RestAssured: How to check the length of json array response?

我有一个 returns 和 JSON 类似的端点:

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

和一个 DTO class:

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);
}

已解决!我是这样解决的:

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

有办法。我用下面的

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

使用放心的 3.0.0

我用 GPath 解决了类似的任务。

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

现在我可以将响应主体提取为字符串并使用内置的 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

@Héctor

[   
   {"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)); 在响应中检查一个节点的长度而不是记录数。

这就是您需要做的以获得尺码。

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

收到回复后,您可以执行以下操作来获取尺码。

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

希望这对您有所帮助。 :)

您只需在正文路径中调用 size()

喜欢:

given()
            .accept(ContentType.JSON)
            .contentType(ContentType.JSON)
            .auth().principal(createPrincipal())
            .when()
            .get("/api/foo")
            .then()
            .statusCode(OK.value())
            .body("bar.size()", is(10))
            .body("dar.size()", is(10));

也可能的选项是 hasSize() 匹配器以及 "." 路径:

import static org.hamcrest.Matchers.hasSize;

...

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

试试这个:)

   Response response = RestAssured
   .given()    
        .header("Content-Type", "application/json")    
   .when()    
        .get("api/v1/blablabla/");    
        
    int responseLength = 
    response.body().jsonPath().getList("$").size();