You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spock测试中为JSON请求文件动态设置日期字段

解决方案

当然可以实现,核心思路是读取JSON模板文件后,动态替换指定字段的值,既保留文件维护的便利性,又能实现动态参数的需求。以下是具体实现步骤:

1. 确认依赖(Spring Boot项目通常已默认包含)

如果项目未引入Jackson JSON处理库,需在构建文件中添加依赖:

// Gradle示例
implementation 'com.fasterxml.jackson.core:jackson-databind'

2. 修改Spock测试用例

通过Jackson解析JSON模板,动态替换trainingDate字段的值:

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

    @LocalServerPort
    int localServerPort
    
    @Autowired
    ObjectMapper objectMapper

    def setup() {
        RestAssured.port = localServerPort
    }

    def 'test' () {
        given:
        // 读取JSON模板文件
        def jsonTemplate = new File(getClass().getResource("/testdata/request.json").toURI()).text
        // 解析为可修改的JSON节点
        def requestNode = objectMapper.readTree(jsonTemplate)
        
        // 计算当前日期+10天并格式化
        def targetDate = LocalDate.now().plusDays(10)
        def formattedDate = targetDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
        
        // 替换trainingDate字段
        requestNode.put("trainingDate", formattedDate)
        
        // 转回JSON字符串作为请求体
        def requestBody = objectMapper.writeValueAsString(requestNode)

        expect:
        given()
            .contentType(ContentType.JSON)
            .body(requestBody)
            .get('/hello')
            .then()
            .statusCode(200)
    }
}

3. 保留原JSON模板文件

request.json无需修改,继续作为固定字段的维护模板:

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

逻辑说明

  • 先读取JSON模板,解析为Jackson的JsonNode对象实现字段修改
  • 用Java 8+的LocalDate计算目标日期,避免传统日期类的线程安全问题
  • 修改完成后将JSON节点重新序列化为字符串,作为请求体发送

这种方式既保留了JSON文件维护固定字段的便捷性,又支持指定字段的动态生成,后续扩展其他动态字段时,只需添加对应的节点修改逻辑即可。

内容的提问来源于stack exchange,提问作者Remo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:15:28