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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:45:22