【问题标题】:Adding mocks to sets works with .times, not with for loop将模拟添加到集合中适用于 .times,而不适用于 for 循环
【发布时间】:2012-04-24 12:34:46
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是哪个版本的 Spock?
  • 抱歉,忘记了。已编辑。 0.5/1.7

标签: java groovy mocking spock


【解决方案1】:

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

amount 迭代编写循环的最短方法是amount.times {},就像在你的第二个sn-p 中一样。

【讨论】:

  • for( index in 1..amount )
  • 哦,是的,当然。非常感谢。 脸红
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多