如何创建每次调用执行闭包的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
相关产品推荐
相关产品推荐

