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

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对多行字符串字面量的处理逻辑发生了变更:

  1. 直接使用"""定义的多行字符串,默认会对代码中的换行进行归一化或压缩(编译器层面的优化或行为调整),将换行替换为空格;
  2. 即使通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:42:22