Spring Boot Rest Assured 访问 JSON 数组的元素并验证字段不起作用

Springboot RestAssured accessing elements of JSON array and validating fields not working

我正在学习 RestAssured 集成测试,并且有一个 Springboot REST API 应用程序已经使用 JUnit 5 进行单元测试。现在,我想向其添加 RestAssured 集成测试,因此,我将 RestAssured 依赖项添加到我的 REST API 我想测试的 Springboot 应用程序,如:

    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <scope>test</scope>
    </dependency>

鉴于我的响应包含 JSON 数组和 JSON 对象,如下所示:

[
    {
        "id": 22,
        "type": "House",
        "size": 3000,
        "soldDate": "2021-03-10"
    },
    {
        "id": 27,
        "type": "Appartment",
        "size": "750",
        "soldDate": "2020-01-22"
    }
]

,我想使用 RestAssured 来测试这个 JSON 响应,但我 运行 遇到了问题。我正在尝试测试以下内容:

    @Test
    final void restAssuredTestGetAllCars() {

        get("myapp/cars")
            .then().statusCode(200)  //validate status code
            .and()
                .body("$", hasSize(2)) // GOOD: validate size of the json array (root)
                .body("$.[0].id", hasItem(22)) //FAIL: validate 1st JSON object id
                .body("$.[0].type", hasItem("House")) //FAIL: validate 1st JSON object type
                .body("$.[0].size", hasItem(3000)) //FAIL: validate 1st JSON object size
                .body("$.[0].soldDate", hasItem("2021-03-10")) //FAIL: validate 1st JSON object size
                ... also validate 2nd JSON object same way as above by accessing [1] index
                ... then validate using hasItems like below
                .body("id", hasItems(22, 27)) //FAIL: validate all ids are present in response
                .body("type", hasItems("House", "Appartment")) //FAIL: validate all types are present in response
                .body("size", hasItems("3000", "750")) //FAIL: validate all sizes are present in response
                .body("soldDate", hasItems("2020-03-10", "2020-01-22")) //FAIL: validate all sizes are present in response
            );

    }

但是,除了验证执行无误的 hasSize(2) 之外,所有其他尝试似乎都不起作用。

这对你有用:

.body("$", hasSize(2))
.body("[0].id", equalTo(22))
.body("[0].type", equalTo("House"))
.body("[0].size", equalTo(3000))
.body("[0].soldDate", equalTo("2021-03-10"))
.body("id", hasItems(22, 27))
.body("type", hasItems("House", "Appartment"))
.body("getAt('size')", hasItems(3000, 750)) //In response: 3000, "750"
.body("soldDate", hasItems("2021-03-10", "2020-01-22"))
  • 通过索引获取:去掉点.,所以$.[0].id --> [0].id

  • size是反向关键字,所以size --> getAt('size')