groovy 在json中设置Spock测试的动态日期

v1l68za4  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(203)

在spock中具有以下单元测试用例

@ActiveProfiles("local")
@ContextConfiguration
@SpringBootTest(webEnvironment = RANDOM_PORT, classes = [DemoAppApplication])
class DemoAppIT extends Specification {

    @LocalServerPort
    int localServerPort

    def setup() {
        RestAssured.port = localServerPort
    }

    def 'test' () {
        expect:
        given()
            .contentType(ContentType.JSON)
            .when()
            .body(Paths.get(getClass().getResource("/testdata/request.json").toURI()).toFile().text)
            .get('/hello')
            .then()
            .statusCode(200)

    }
}

下面是request.json文件

{
      "trainingDate": "2022-08-10",
      "code": "ZMD",
      "name": "demo"
    }

这里我想动态填充trainingDate字段。动态值应该是当前日期+ 10天,格式与上面的相同。
当我将请求主体传递给/helloapi时,日期应该以动态方式传递。
例如:
当前日期为2022-07-01,并且每次都要在请求正文中加上10天。格式为YYYY-MM-dd
有没有可能做到这一点?
注意:我正在文件中维护请求

ebdffaop

ebdffaop1#

只需使用GString和注解中已共享的代码@OleVV。

@ActiveProfiles("local")
@ContextConfiguration
@SpringBootTest(webEnvironment = RANDOM_PORT, classes = [DemoAppApplication])
class DemoAppIT extends Specification {

    @LocalServerPort
    int localServerPort

    def setup() {
        RestAssured.port = localServerPort
    }

    def 'test' () {
        expect:
        given()
            .contentType(ContentType.JSON)
            .when()
            .body("""
    {
      "trainingDate": "${LocalDate.now(ZoneId.systemDefault()).plusDays(10)}",
      "code": "ZMD",
      "name": "demo"
    }
            """)
            .get('/hello')
            .then()
            .statusCode(200)

    }
}

编辑:
由于OP确实想保留原来的文件,这里有一种方法可以做到.我们必须替换文件中的文本,在如何做上总是有取舍的,要么用占位符或者简单的文本替换,要么用json的解组和编组。
为了尽可能接近原始请求,我将使用文本替换。

def originalBody = Paths.get(getClass().getResource("/testdata/request.json").toURI()).toFile().text
def newBody = originalBody.replace("2022-08-10", LocalDate.now(ZoneId.systemDefault()).plusDays(10).toString())

那么只需在请求中使用newBody

相关问题