我们在Spock中遇到了一种非常特殊的嘲讽行为。
在Spock(0.5,Groovy 1.7)given:
块(amount
是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)
}
有没有人知道为什么第一个版本不起作用?
答案 0 :(得分:3)
这个问题与Spock(和Set
s)无关。 for (index in amount)
根本不是在Groovy中使用amount
次迭代编写循环的正确方法。在in
之后,Groovy期望它知道如何迭代(例如Iterable
)。回退是(逻辑上)将对象视为仅包含自身的集合。这解释了为什么你只得到index == amount
的一次迭代。
使用amount
次迭代编写循环的最短方法是amount.times {}
,就像在第二个代码段中一样。