2017-04-10 60 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 * _