如何避免在Spock中输入参数
问题描述:
我想从存储库获取List并声明其内容。如何避免在Spock中输入参数
在下面的代码我得到指出Object
不能被分配到List
有什么办法来增加更好的理由来处理这种情况的警告?
myDomainObjectRepository.save(_) >> { arguments ->
final List<MyDomainObject> myDomainObjects = arguments[0]
assert myDomainObjects == [new MyDomainObject(someId, someData)]
}
答
为了详细说明蛋白石的答案:有两个部分,并在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)]
}
+0
很酷的答案!谢谢! – Opal
我刚刚添加了一种让IDE高兴的方式,请参阅编辑。 –