0

我们在 Spock 中遇到了一个非常奇特的模拟和集合行为。

在 Spock (0.5, Groovy 1.7)given:块中 ( amountis an Integer):

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

Set该问题与 Spock (和s)无关。这根本不是在 Groovyfor (index in amount)中编写带有迭代的循环的正确方法。amount在 之后in,Groovy 期望它知道如何迭代的东西(例如Iterable)。回退是(逻辑上)将对象视为仅包含其自身的集合。这就解释了为什么你只得到一次迭代 where index == amount.

编写带有amount迭代的循环的最短方法是amount.times {},如您的第二个片段中所示。

于 2012-04-24T13:35:06.003 回答