Spock 模拟 inputStream 导致无限循环
Spock mocking inputStream causes infinite loop
我有一个代码:
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 次(或类似的)交互测试上面的行。
以下测试有效:
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.
我有一个代码:
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 次(或类似的)交互测试上面的行。
以下测试有效:
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.