如何在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
相关产品推荐
相关产品推荐

