2017-10-16 77 views
1

我想从存储库获取List并声明其内容。如何避免在Spock中输入参数

在下面的代码我得到指出Object不能被分配到List

有什么办法来增加更好的理由来处理这种情况的警告?

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

我刚刚添加了一种让IDE高兴的方式,请参阅编辑。 –

回答

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)] 
} 
+0

很酷的答案!谢谢! – Opal

1

docs似乎是准确的:

如果封闭声明了一个无类型的参数,它就会通过这个方法的参数列表

但是我只是改变了我的规范使用rightShift + arguments接受单一类型的参数,它确实有效。试试看。

+0

我的代码有效,但IDE引发了一个警告 - 我想改变它的方式 – pixel

+0

@pixel它会引发什么警告? – Opal

+0

'不能将'Object'分配给'List ',另一个'getAt'不能应用于Integer – pixel

相关问题