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

从Spock 1.3(Groovy2.4)升级到2.x(Groovy4.0)后带参构造Spy失效

Spock 2.0升级后Spy闭包委托丢失导致Jenkins共享库字段访问失败问题及修复方案

问题背景

在Spock 1.3中,使用带构造参数的Spy时,被Spy对象创建的闭包会自动将该类实例作为闭包委托。但升级到Spock 2.0后,这一默认行为被移除:闭包不再自动关联类实例作为委托。

针对Jenkins共享库中的被测类(未为env、steps字段定义getter方法),在闭包中访问steps字段时会触发报错:

No signature of method: MyClass.getSteps()

需要注意的是,直接在类方法中调用steps.method()可以正常执行,但将相同调用放在闭包内就会失败。

修复方案

方案一:为字段添加getter方法

为steps、env字段手动添加getter方法,让闭包能通过属性访问规则找到对应字段:

def getSteps() { return steps }
def getEnv() { return env }

方案二:手动设置闭包的delegate

在创建闭包后,显式将闭包的delegate设置为当前类实例this,恢复Spock 1.3时期的委托关联逻辑:

def myClosure = {
    // 闭包内逻辑,例如调用steps.someJenkinsMethod()
}
myClosure.delegate = this
// 可选:若需要优先使用委托的属性/方法,可设置解析策略
// myClosure.resolveStrategy = Closure.DELEGATE_FIRST

内容的提问来源于stack exchange,提问作者Peter Kahn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:12:05