Spock模拟inputStream会导致无限循环

时间:2017-03-25 09:05:00

标签: java unit-testing grails groovy spock

我有一个代码:

gridFSFile.inputStream?.bytes

当我尝试以这种方式测试时:

given:
def inputStream = Mock(InputStream)
def gridFSDBFile = Mock(GridFSDBFile)
List<Byte> byteList = "test data".bytes
...
then:
1 * gridFSDBFile.getInputStream() >> inputStream
1 * inputStream.getBytes() >> byteList
0 * _

问题是inputStream.read(_)被称为无限次。当我删除0 * _时 - 测试会挂起,直到垃圾收集器死亡。

请告知我如何正确模拟InputStream而不会陷入无限循环,即能够用2(或类似)交互测试上面的行。

1 个答案:

答案 0 :(得分:1)

以下测试有效:

import spock.lang.Specification

class Spec extends Specification {

    def 'it works'() {
        given:
        def is = GroovyMock(InputStream)
        def file = Mock(GridFile)
        byte[] bytes = 'test data'.bytes

        when:
        new FileHolder(file: file).read()

        then:
        1 * file.getInputStream() >> is
        1 * is.getBytes() >> bytes
    }

    class FileHolder {
        GridFile file;

        def read() {
            file.getInputStream().getBytes()
        }
    }

    class GridFile {
        InputStream getInputStream() {
            null
        }
    }
}

不是100%肯定它,但似乎你需要在这里使用GroovyMock,因为getBytes是一个由groovy动态添加的方法。看看here