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
注解
我在 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
注解