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

Spock测试中deployStreamSOA Mock失效,实际方法执行问题咨询

问题分析与解决方案

为什么deployStreamSOA没被Mock,但内部方法可以?

这其实是Spock Spy的默认行为导致的:

  • Spy是基于真实对象的包装,默认会执行所有方法的真实逻辑。你之前用deployStreamSOA(_ as Map) >> ""这种>>语法,只是替换了方法的返回值,但真实方法里的代码还是会完整执行——这就是你看到真实逻辑跑起来的原因。
  • 而当你MockdeployStreamSOA内部的方法(比如getDownloadArtifactName)时,这些内部方法的真实逻辑被拦截替换了,所以即使deployStreamSOA的真实代码在执行,也不会触发实际的业务操作,自然测试就能通过。

无需Mock所有内部方法的解决办法

你需要用Spock的doReturn(如果方法有返回值)或doNothing(如果是void方法)语法,来完全跳过deployStreamSOA的真实执行逻辑。这种语法会直接返回你指定的值,根本不会调用真实方法。

修改后的测试代码如下:

def "type is SOA then deployStreamSOA is called"() {
    setup:
    def artifactList = [[groupId: "com.company", artifactId: "artifact1", version: "1.0.0"]]
    DeployArtifacts deployArtifacts = Spy(DeployArtifacts, constructorArgs: [ArtifactType.SOA])

    // 用doReturn跳过真实方法执行,直接返回指定值
    doReturn("").when(deployArtifacts).deployStreamSOA(_ as Map)

    when: "DeployArtifact call is passed the SOA ArtifactType"
    deployArtifacts.call(artifactList)

    then: "the deployStreamSOA method is called"
    1 * deployArtifacts.deployStreamSOA(_)
}

如果deployStreamSOA是无返回值的void方法,把doReturn("")换成doNothing()即可:

doNothing().when(deployArtifacts).deployStreamSOA(_ as Map)

另外补充一句:你之前的动态方法调用"${methodName}"(artifact)完全没问题,Spock的Spy可以正常拦截这种Groovy动态调用,不需要改成普通方法调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:13:11