Spock模拟inputStream导致无限循环p2

时间:2017-04-10 16:26:27

标签: unit-testing grails groovy spock

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

我在link之前问了类似的问题。

问题已解决,但当我添加@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时,问题又回来了。

2 个答案:

答案 0 :(得分:1)

为什么需要模拟输入流?

你不能这样做:

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 * _

答案 1 :(得分:0)

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