如何避免在Spock中抛出参数

时间:2017-10-16 20:13:13

标签: groovy spock

我想从存储库中获取一个List并断言其内容。

在以下代码中,我收到一条警告,指出无法将Object分配给List

有没有办法添加更好的参数来处理这种情况?

myDomainObjectRepository.save(_) >> { arguments ->
   final List<MyDomainObject> myDomainObjects = arguments[0]
   assert myDomainObjects == [new MyDomainObject(someId, someData)]
}

2 个答案:

答案 0 :(得分:2)

详细说明蛋白石回答:docs中有两个部分和一个与此相关的脚注:

  

如果闭包声明了一个无类型参数,则会传递给它   方法的参数列表:

并且

  

在大多数情况下,直接访问该网站会更方便   方法的论点。如果闭包声明了多个参数或   单个类型参数,方法参数将逐个映射   关闭参数[脚注]:

脚注:

  

闭包参数的解构语义直接来自   Groovy的。

问题是你有一个参数列表,并且由于泛型被删除,groovy无法决定你真的想要打开列表。

因此,单个非List参数可以正常工作:

myDomainObjectRepository.save(_) >> { MyDomainObject myDomainObject ->
   assert myDomainObject == new MyDomainObject(someId, someData)
}

List参数与第二个结合,例如save(List domain, boolean flush)

myDomainObjectRepository.save(_, _) >> { List<MyDomainObject> myDomainObjects, boolean flush -> 
   assert myDomainObjects == [new MyDomainObject(someId, someData)]
}

所以文档对这个边缘情况有点误导。对于这种情况,我担心你会因为施法而陷入困境。

编辑:如果你这样做,你应该能够摆脱IDE警告。

myDomainObjectRepository.save(_) >> { List<List<MyDomainObject>> arguments ->
   List<MyDomainObject> myDomainObjects = arguments[0]
   assert myDomainObjects == [new MyDomainObject(someId, someData)]
}

答案 1 :(得分:1)

docs似乎是准确的:

如果闭包声明了一个无类型参数,它将传递方法的参数列表

但是我刚刚更改了使用rightShift + arguments来接受单个类型参数的规范,它确实有用。尝试一下。