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();
我有一个 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();