Groovy、Spock与Rest Assured集成测试三元运算符使用问题
问题分析与修复
问题根源
你手动拼接JSON时的插值逻辑有误:当myTime传入时间字符串时,插值后直接将裸字符串写入JSON,导致startDateTime的值没有被双引号包裹,违反了JSON语法规则(字符串类型必须用双引号包裹)。而传入"null"时,插值结果是null,这符合JSON中null值的写法,所以能正常解析。
修复方案
方案1:修正字符串插值逻辑
直接调整插值表达式,给非null的时间值添加双引号,同时保留null的正确格式:
void 'should pass some test() { given: stubFor(get(urlEqualTo("/someVal/$productOrderId")) .willReturn(defaultWiremockResponse() .withBody(""" { "startDateTime" : ${myTime == "null" ? null : "\"$myTime\""} } """ ) //...... some when //...... some then where: productOrderId | myTime "1" | "2023-04-23T07:13:15.862Z" "2" | "null" }
这里通过判断myTime是否为"null",分别输出无引号的null或带双引号的时间字符串,确保生成的JSON语法合法。
方案2:使用JSON工具生成响应体(推荐)
手动拼接JSON容易出现语法错误,更稳妥的方式是用Groovy的JsonBuilder自动生成合法的JSON:
void 'should pass some test() { given: def jsonBuilder = new groovy.json.JsonBuilder() jsonBuilder { startDateTime = myTime == "null" ? null : myTime } stubFor(get(urlEqualTo("/someVal/$productOrderId")) .willReturn(defaultWiremockResponse() .withBody(jsonBuilder.toString()) ) //...... some when //...... some then where: productOrderId | myTime "1" | "2023-04-23T07:13:15.862Z" "2" | "null" }
JsonBuilder会自动处理所有JSON语法细节:字符串自动加双引号,null值保持正确格式,彻底避免手动拼接的风险。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

