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

如何创建每次调用执行闭包的Spock Mock?解决InputStream复用问题

解决Mock多次返回新InputStream的问题

直接在>>>后传入闭包,每次调用mock方法时都会执行闭包生成全新的InputStream实例:

def myMock = Mock(MyClass) {
    get(InputStream) >>> {
        new ByteArrayInputStream("bla bla".getBytes(Charset.defaultCharset()))
    }
}

为什么之前的写法无效?

你之前用[].withDefault{...}的方式,本质是给>>>传了一个列表对象。Spock处理列表类型返回值时,会按调用顺序依次取出列表元素;但withDefault仅在访问列表不存在的索引时才触发闭包生成元素,而Spock的mock逻辑不会主动触发这个机制,所以第一次调用就会取到不存在的元素(返回null),后续调用同理,导致始终返回null。

补充说明

这种闭包方式无需提前知晓方法调用次数,每次调用mock的get方法时,都会执行闭包代码生成全新的ByteArrayInputStream实例,完美解决流关闭后无法复用的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:17:06