2017-04-10 139 views
0

我在gock单元测试中嘲笑grails 3.1.7中的InputStream有问题。Spock mocking inputStream导致无限循环p2

我在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时,问题又回来了。

+0

请提供[MCVE(http://stackoverflow.com/help/mcve),即完全用类进口(其中做'GridFSFile'和'图像'来自,例如?),也是一个完整的测试课程。请不要在没有上下文的情况下发布片段,问题可能出现在您未显示的代码中。 – kriegaex

+0

我猜spock不能和'@ CompileStatic'和'@ TypeChecked'一起工作。 – Opal

回答

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