Spock 模拟 inputStream 导致无限循环 p2

Spock mocking inputStream causes infinite loop p2

我在 spock 单元测试的 grails 3.1.7 中模拟 InputStream 时遇到问题。

我之前问过类似的问题

一个问题已经解决,但是当我添加 @CompileStatic 注释时它返回了。我的代码:

@CompileStatic
class MongoImage implements Image {
    GridFSFile gridFSFile
    ...
    byte[] getBytes() {
        ((GridFSDBFile) gridFSFile).inputStream?.bytes
    }
}

我的测试:

given:
List<Byte> byteList = "test data".bytes
def inputStream = GroovyMock(InputStream)
def gridFSDBFile = Mock(GridFSDBFile)
def mongoImage = new MongoImage(gridFSDBFile)

when:
List<Byte> result = mongoImage.getBytes()

then:
1 * gridFSDBFile.getInputStream() >> inputStream
1 * inputStream.getBytes() >> byteList
0 * _

此测试执行陷入无限调用:

1 * inputStream.close()
1 * inputStream.read(...)

我之前的问题是通过将 Mock(InputStream) 替换为 GroovyMock(InputStream) 来解决的。但是当我应用 @CompileStatic 时,问题又回来了。

为什么需要模拟输入流?

你就不能这样做吗:

given:
byte[] byteList = "test data".bytes
def gridFSDBFile = Mock(GridFSDBFile)
def mongoImage = new MongoImage(gridFSDBFile)

when:
byte[] result = mongoImage.getBytes()

then:
1 * gridFSDBFile.getInputStream() >> new ByteArrayInputStream(byteList)
0 * _

我遇到过同样的问题。当我删除 @CompileStatic 时能够模拟 class。 所以我在编译时为类型检查添加了 @TypeChecked注解