向集合添加模拟可以使用.times,而不是使用for循环

时间:2012-04-24 12:34:46

标签: java groovy mocking spock

我们在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)
}

有没有人知道为什么第一个版本不起作用?

1 个答案:

答案 0 :(得分:3)

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

使用amount次迭代编写循环的最短方法是amount.times {},就像在第二个代码段中一样。