这是在使用 Spock 进行"数据驱动"测试的上下文中:
where:
key << myDriver.myMap.keySet()
。工作正常:提供键值,参数化测试工作正常。
但是如果我尝试这个:
where:
key << { myDriver.myMap.keySet() }
它不起作用。然后,<<
的 RHS 上的对象是一个Closure
。然后,我尝试了许多方法,试图从这个Closure
中哄骗"数据提供者"。
我想首先在那里放一个闭包,以便我可以进行一些调试,但也提供一组更复杂的排列(不仅是"键"值,还有其他测试参数的值......请参阅我最近的一个问题 这里).
也许keySet()
提供的课程无济于事:事实证明这是一个LinkedHashMap$LinkedKeySet
......但这显然是Iterable
.
我对这个"数据提供者"类别有点困惑。在斯波克"教程"中,它说这必须实现Iterable
.它没有说这是否是它的所有特征。会
{ myDriver.myMap.keySet() }.iterator()
无济于事...iterator()
显然提供了Iterator
,而不是Iterable
。然后我得到的是这样的恐怖:
groovy.lang.MissingMethodException: 没有方法的签名: 核心。MyModule.processCommand() 适用于参数类型: (核心。UT_ForMyModule__spock_feature_1_12prov0_closure8美元, 乔普特。OptionSet, java.util.ArrayList) 值: [核心。UT_ForMyModule$__spock_feature_1_12prov0_closure8@65fdd86b, ...]
。这显然意味着它正在提供一个Iterator
,该在精确Closure
的Collection
上进行迭代。
那么,简而言之,我如何从返回Iterable
的闭包中获得Iterable
?
除非您在此处延迟执行目标,否则我相信只需运行闭包即可:
key << { myDriver.myMap.keySet() }()
但请注意,这将在语句中执行它。