0

Spockのモックとセットで非常に独特な動作に遭遇しました。

Spock(0.5、Groovy 1.7)given:ブロック(amountInteger):

Set<Operand> operands=new HashSet<Operand>()
for (index in amount){
  operand = Mock(Operand)
  operand.update() >> null
  operands.add(operand)
}

各ループの実行後(閉じ括弧のブレークポイント)、ループが新たに開始されるとき、セットには1つの要素しかありませんoperands.size() == 0。どうやら、モックオブジェクトは不思議なことに消えます。

次のバージョンでは、すべてが機能しoperands.size() == amount、ループの実行後にセットが機能します。

Set<Operand> operands=new HashSet<Operand>()
amount.times{
  operand = Mock(Operand)
  operand.update() >> null
  operands.add(operand)
}

最初のバージョンが機能しない理由を誰かが知っていますか?

4

1 に答える 1

3

この問題はSpock(およびSets)とは関係ありません。Groovyで反復を使用しfor (index in amount)てループを作成する正しい方法ではありません。amountその後in、Groovyは、反復する方法を知っている何かを期待します(例:)Iterable。フォールバックは、オブジェクトを(論理的に)それ自体を含むコレクションとして扱うことです。これは、ここで1回の反復しか得られない理由を説明していますindex == amount

2番目のスニペットのように、amount反復を使用してループを作成する最短の方法はです。amount.times {}

于 2012-04-24T13:35:06.003 に答える