Kotlin中使用Groovy/Spock可否同时mock方法及其实现的接口属性?
根因说明
Spock默认的Mock为全量mock,会重写目标类的所有方法实现,Kotlin类中somethingCommon绑定somethingSpecific的真实Getter逻辑不会被执行,因此需要分别打桩。
可行解决方案
方案1:使用Spy(部分mock)【最推荐】
Spy默认会保留目标类的原有实现逻辑,仅对显式打桩的内容做替换,只要给somethingSpecific打桩,somethingCommon会自动走真实逻辑取值:
// 方式1:构造时直接传参,无需额外打桩 def thing = Spy(SomeClass, constructorArgs: ["blah"]) // 方式2:单独打桩特有属性 def thing = Spy(SomeClass) thing.somethingSpecific >> "blah"
方案2:单Mock声明块内关联属性
将两个属性的打桩逻辑放在同一个mock初始化块内,写法更紧凑:
def thing = Mock(SomeClass) { somethingSpecific >> "blah" somethingCommon >> somethingSpecific }
方案3:封装通用打桩工具方法
如果项目中存在大量同类场景,可以封装工具方法统一处理,减少重复代码:
// 通用mock工具方法 def <T extends SomeInterface> T mockSomeInterfaceImpl(Class<T> implClass, String specificValue) { def mock = Mock(implClass) mock.somethingSpecific >> specificValue mock.somethingCommon >> specificValue return mock } // 业务测试中直接调用 def thing = mockSomeInterfaceImpl(SomeClass, "blah")
内容的提问来源于stack exchange,提问作者Brendan Hill
相关产品推荐
相关产品推荐

