2013-07-10 76 views
3

我測試,它返回[]Groovy的。每個閉合包裹片[]

List<Object[]> list = someService.someMethod() 
list.each { Object[] row -> 
    assertEquals(A_SIZE,row.length) 
} 

我雙通過調試器檢查對象的列表的服務,列表的元素是對象[8],但行被初始化爲Object [1],其中包含Object [8],因此除非A_SIZE爲1(在我的場景中沒有意義),否則測試將失敗。 如果我改變斷言到:

assertEquals(A_SIZE, row[0].length) 

測試去罰款,但我不明白爲什麼我需要的「[0]」,因爲「行」應該是對象[8]據我所知,從Groovy規範。

我使用的是groovy 2.1和grails 2.3M2;該列表來自MyDomainClass.createCriteria()。

+0

聞起來像中的錯誤Groovy的類型強制...作爲一個解決方法,你可以使用'list.each {row - >' –

+0

它的工作原理!請將解決方案作爲回覆發佈,我會接受它。 謝謝 –

+0

完成:-)(我相信是它的根本原因) –

回答

4

我認爲Groovy遇到麻煩了解如何將Object[]映射到Closure參數。一種解決方法是不聲明封閉參數的類型,像這樣:

list.each { row -> 
    assertEquals(A_SIZE,row.length) 
} 

我問了一圈,我想這是因爲Groovy目前試圖「適應」的對象的封閉參數(在這樣,這工作)

// Returns [ 3, 7 ] 
[ [ 1, 2 ], [ 3, 4 ] ].collect { a, b -> 
    a + b 
} 

已經有辯論,對於Groovy是否應該做這種解構與否的郵件列表上,但現在,它確實:-)

+0

非常明確的解釋,謝謝 –