Groovy 4.0.24多行字符串换行符异常问题求助
Groovy 4.0.24多行字符串断言失败问题解决
问题现象
升级Groovy到4.0.24版本后,测试中的多行字符串断言出现两种异常:
- 直接使用
"""定义多行字符串时,代码中的换行被自动替换为空格,导致断言失败:
断言失败信息显示预期值为assert string == """Aaa := Bbb Ccc := Ddd""""Aaa := Bbb Ccc := Ddd",而实际值是'Aaa := Bbb\r\nCcc := Ddd'。 - 改用
new String("""...""")后,换行被保留但统一转为\n,与Windows平台生成的\r\n不匹配,依然断言失败。
原因分析
Groovy 4.x对多行字符串字面量的处理逻辑发生了变更:
- 直接使用
"""定义的多行字符串,默认会对代码中的换行进行归一化或压缩(编译器层面的优化或行为调整),将换行替换为空格; - 即使通过
new String()包装,Groovy编译时仍会把代码里的换行统一转为\n,无法自动适配Windows平台的\r\n换行符。
解决方案
针对不同场景,可采用以下几种方式解决:
1. 明确指定Windows换行符
在多行字符串中直接写入\r\n转义字符,强制匹配Windows平台的换行格式:
assert string == """Aaa := Bbb\r\nCcc := Ddd"""
2. 转换换行符格式
利用字符串方法将多行字符串的换行符统一转为\r\n:
assert string == """Aaa := Bbb Ccc := Ddd""".replace('\n', '\r\n')
3. 使用平台无关的换行符常量
借助System.lineSeparator()获取当前平台的默认换行符,保证跨平台兼容性:
def lineSep = System.lineSeparator() assert string == "Aaa := Bbb${lineSep}Ccc := Ddd"
4. 检查编译器配置
如果项目中使用了@CompileStatic或自定义编译选项,检查是否开启了stripIndent、trimMargin等会影响多行字符串处理的注解或参数,调整配置以保留原始换行。
内容的提问来源于stack exchange,提问作者holz name
相关产品推荐
相关产品推荐

