Spock测试中deployStreamSOA Mock失效,实际方法执行问题咨询
问题分析与解决方案
为什么deployStreamSOA没被Mock,但内部方法可以?
这其实是Spock Spy的默认行为导致的:
- Spy是基于真实对象的包装,默认会执行所有方法的真实逻辑。你之前用
deployStreamSOA(_ as Map) >> ""这种>>语法,只是替换了方法的返回值,但真实方法里的代码还是会完整执行——这就是你看到真实逻辑跑起来的原因。 - 而当你Mock
deployStreamSOA内部的方法(比如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
相关产品推荐
相关产品推荐

