Groovy校验响应数组中指定日期存在性时断言失败问题
问题分析与解决方案
从你提供的错误信息和代码来看,核心问题是类型不匹配导致contains断言失败:
responseStartDateTime是一个包含日期值的列表,但这些值大概率是Date对象(JSON解析器自动转换的结果)requestStartDateTime是你手动格式化后的字符串
Groovy的contains方法会严格校验元素的类型和值,所以即使日期的字符串表现完全一致,Date对象和字符串也会被判定为不相等,最终导致断言返回false。
修复方案
方案1:将请求日期转为Date对象再比较
把你生成的requestStartDateTime字符串转回Date类型,和响应中的元素类型保持一致:
// 在断言之前添加这段代码 def dateFormatter = new SimpleDateFormat(outputDateFormat) def requestStartDate = dateFormatter.parse(requestStartDateTime) def requestEndDate = dateFormatter.parse(requestEndDateTime) // 修改断言语句 assert responseStartDateTime.contains(requestStartDate) assert responseEndDateTime.contains(requestEndDate)
方案2:将响应日期数组转为字符串列表再比较
把响应中的每个日期对象格式化为字符串,再和请求的日期字符串对比:
// 将响应中的日期转为指定格式的字符串列表 def dateFormatter = new SimpleDateFormat(outputDateFormat) def responseStartStrings = responseStartDateTime.collect { dateFormatter.format(it) } def responseEndStrings = responseEndDateTime.collect { dateFormatter.format(it) } // 修改断言语句 assert responseStartStrings.contains(requestStartDateTime) assert responseEndStrings.contains(requestEndDateTime)
额外优化建议
你解析原始请求日期的方式可以更严谨,因为原始的StartDateTime是带.000Z的ISO格式,建议使用支持时区的日期格式解析:
// 替换原有的解析代码 def inputDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSX" def outputDateFormat = "yyyy-MM-dd'T'HH:mm:ss" def dateFormatter = new SimpleDateFormat(inputDateFormat) start = dateFormatter.parse(StartDateTime) end = dateFormatter.parse(EndDateTime) def requestStartDateTime = new SimpleDateFormat(outputDateFormat).format(start) def requestEndDateTime = new SimpleDateFormat(outputDateFormat).format(end)
另外,你可以先打印响应日期元素的类型,明确问题根源:
log.info "Response StartTime element type: ${responseStartDateTime[0].class.name}"
内容的提问来源于stack exchange,提问作者rAJ
相关产品推荐
相关产品推荐

