3

Object[] のリストを返すサービスをテストしています

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

デバッガーで再確認しましたが、リストの要素は Object[8] ですが、行は Object[8] を含む Object[1] として初期化されるため、A_SIZE が 1 でない限りテストは失敗します (これは私のシナリオでは意味がありません)。 . アサートを次のように変更すると:

assertEquals(A_SIZE, row[0].length)

テストはうまくいきますが、Groovy の仕様から理解できる限り、「行」は Object[8] であるはずなので、「[0]」が必要な理由がわかりません。

Groovy 2.1 と grails 2.3M2 を使用しています。リストは MyDomainClass.createCriteria() から取得されます。

4

1 に答える 1

4

Object[]Groovy は、 を 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 に答える