我正在测试一个返回List of Object []
的服务List<Object[]> list = someService.someMethod()
list.each { Object[] row ->
assertEquals(A_SIZE,row.length)
}
我仔细检查了调试器,list的元素是Object [8],但是行被初始化为Object [1],其中包含一个Object [8],所以测试失败,除非A_SIZE为1(这是没有意义的我的情景)。 如果我将断言更改为:
assertEquals(A_SIZE, row[0].length)
测试没问题,但我不明白为什么我需要“[0]”,因为“row”应该是Object [8],据我从Groovy规范中理解。
我使用groovy 2.1和grails 2.3M2;该列表来自MyDomainClass.createCriteria()。
答案 0 :(得分:4)
我认为Groovy在解决如何将Object[]
映射到Closure参数方面遇到了麻烦。解决方法是不要像这样声明Closure参数的类型:
list.each { row ->
assertEquals(A_SIZE,row.length)
}
我已经问过了,我认为这是因为Groovy目前试图将对象“适合”Closure参数(以这种方式工作)
// Returns [ 3, 7 ]
[ [ 1, 2 ], [ 3, 4 ] ].collect { a, b ->
a + b
}
关于Groovy是否应该在邮件列表上进行此类解构,一直存在争议,但就目前而言,确实如此: - )