IntelliJ IDEA中Groovy代码用.size报错,改用.size()正常,求原因
Groovy中.size与.size()断言失败的问题
问题场景
在Groovy 4.0.0(JVM 17.0.8,IntelliJ IDEA 2023.2.2旗舰版)环境下,运行断言代码时出现差异:
使用不带括号的.size时断言失败:
response.errors.size == 0
断言失败输出:
Assertion failed: assert response.errors.size == 0 | | | | null [] | common.RESTResponse@53abfc07
改用带括号的.size()则正常通过:
response.errors.size() == 0
已知响应无错误,认为errors是空数组,但实际运行结果不符合预期。
原因分析
核心问题在于Groovy对**属性访问(不带括号)和方法调用(带括号)**的处理逻辑差异,结合response.errors实际为null的情况:
.size():Groovy对null对象的方法调用有特殊处理,NullObject(Groovy包装null的类)中size()方法返回0,因此断言成立。.size:作为属性访问时,Groovy会尝试查找getSize()方法或size字段,NullObject的size属性返回空集合[],[] == 0显然不成立,导致断言失败。
另外你误以为errors是空数组,但从断言输出看response.errors实际是null,这是触发该问题的前提。
解决方案
- 修正数据源:检查
RESTResponse类的实现,确保无错误时errors被初始化为空数组(如new Error[0])而非null,这样.size也能正确返回0。 - 统一写法:优先使用
.size()方法调用,这是Groovy获取集合/数组大小的标准方式,避免属性访问的歧义:assert response.errors.size() == 0 - 安全处理null:如果无法保证
errors不为null,使用安全导航运算符?.避免潜在的NPE:assert response.errors?.size() == 0
内容的提问来源于stack exchange,提问作者fred
相关产品推荐
相关产品推荐

