如何将从闭包返回的"data provider"更改为"data provider"?



这是在使用 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,该在精确ClosureCollection上进行迭代。

那么,简而言之,我如何从返回Iterable的闭包中获得Iterable

除非您在此处延迟执行目标,否则我相信只需运行闭包即可:

key << { myDriver.myMap.keySet() }()

但请注意,这将在语句中执行它。

最新更新