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

Java-Spock框架where代码块数据传递失效问题求助

问题排查与修复

核心问题1:变量名不匹配导致Mock未生效

你的setup方法中初始化的Mock对象是mockTokenConnector,但测试方法的when块里用的是mockConnector,这会导致Stub设置到了一个未初始化的对象上,实际服务调用的不是你配置的Mock,自然拿不到responseData。

核心问题2:tokenInfos初始化时机错误

Spock的where块会在所有setup/setupSpec方法执行之前就完成数据绑定,而你在setup方法里才给@Shared的tokenInfos赋值,此时where块已经解析完毕,拿到的是tokenInfos的初始值null。

额外笔误:测试方法中调用了未初始化的对象

原测试方法里的ResponseData res = tokenService.getAllData(userId)是笔误,你在given块中获取的是service对象,应该改为service.getAllData(userId)。


修正后的完整代码

初始化部分修正

@Shared
Info[] tokenInfos = getMockInfoBody() // 直接在@Shared声明时初始化,确保where块能拿到值

def setup() {
    mockTokenConnector = Mock(SampleConnector.class)
}

private static Info[] getMockInfoBody() {
    Info infoDeactivated = new Info("123", "http://abc.xyz.com", "D")
    Info infoActive = new Info("234", "http://abc.xyz.com", "A")
    Info infoSuspended = new Info("235", "http://abc.xyz.com", "S")

    Info[] tokenInfos = new Info[3]
    tokenInfos[0] = infoDeactivated
    tokenInfos[1] = infoActive
    tokenInfos[2] = infoSuspended

    return tokenInfos
}

测试方法修正

def "method response should contain count as expected" () {
    given:
    SomeServiceImpl service = applicationContext.getBean(SomeServiceImpl.class)
    service.setTokenConnector(mockTokenConnector) // 提前绑定Mock,避免重复设置

    when:
    mockTokenConnector.getResponse(userId) >> responseData
    ResponseData res = service.getAllData(userId)
    def count = ((ListResponseMeta)(res.getMeta())).getCount()

    then:
    count == expected

    where:
    responseData | expected
    tokenInfos   | 1 // 假设你的service逻辑是统计状态为"A"的数量,这里预期1是合理的
    null         | 0
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:10:25