groovy 如何在Spock框架中创建一个带闭包的分离模拟?

r3i60tvu  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(149)

很高兴看到我们可以从Spock 1.1开始使用detached mocks,特别是如果我们想为样板UT编码创建一个模拟实用程序。
但似乎DetachedMockFactory拒绝使用闭包进行初始化。

class MockUtils {
    def mockFactory = new DetachedMockFactory()

    IRequestContextGetter mockDefaultRequestContext() {
        return mockFactory.Mock(IRequestContextGetter) {
            tenant >> Constants.TENANT
            currencyType >> CurrencyEnum.SGD
        }
    }
}

它抛出以下错误:
不能将“spock.mock.DetachedMockFactory”中的“模拟”应用于“(java.lang.Class<com.bytedance.cg.gcrm.salesplanning.common.utils.requestcontext.IRequestContextGetter>,groovy.lang.闭包)”
如何创建一个带有闭包的分离的mock?

np8igboo

np8igboo1#

简而言之,你不能。
更长的答案是,在Spock中,模拟交互实际上是规范的一部分,而不是模拟对象本身。因此,分离的模拟在被附加到规范之前不能有任何交互。
有一种方法,但相当繁琐。您可以定义自己的IDegLira来处理模拟交互,并以这种方式自定义您的响应。

import org.spockframework.util.*
import org.spockframework.mock.*
import spock.mock.*
    
interface Foo {
    String getBar()
}

class CustomResponse implements IDefaultResponse {
    public Object respond(IMockInvocation invocation) {
        'foo'
    }
}

def factory = new DetachedMockFactory()
def stub = factory.Stub(Foo, defaultResponse: new CustomResponse())
assert stub.bar == 'foo'

Groovy Web Console中试用

相关问题