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
相关产品推荐
相关产品推荐

