3

我正在测试一个返回 Object[] 列表的服务

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

我通过调试器仔细检查,列表的元素是 Object[8],但是行被初始化为一个 Object[1],其中包含一个 Object[8],所以测试失败,除非 A_SIZE 为 1(这在我的场景中没有意义) . 如果我将断言更改为:

assertEquals(A_SIZE, row[0].length)

测试顺利,但我不明白为什么我需要“[0]”,因为据我从 Groovy 规范了解,“行”应该是 Object[8]。

我正在使用 groovy 2.1 和 grails 2.3M2;该列表来自 MyDomainClass.createCriteria()。

4

1 回答 1

4

我认为 Groovy 无法确定如何将 映射Object[]到 Closure 参数。一种解决方法是不要像这样声明 Closure 参数的类型:

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

我四处询问,我认为这是因为 Groovy 当前试图将对象“拟合”到闭包参数(以这种方式工作)

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

关于 Groovy 是否应该在邮件列表中进行这种解构一直存在争议,但现在,它确实 :-)

于 2013-07-10T13:34:25.587 回答