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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:39:03