Это в контексте «управляемого данными» тестирования с помощью Спока:
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: Нет подписи метода:
core.MyModule.processCommand () применим для типов аргументов:
(Core.UT_ForMyModule $ __ spock_feature_1_12prov0_closure8,
значения joptsimple.OptionSet, java.util.ArrayList):
[core.UT_ForMyModule$__spock_feature_1_12prov0_closure8@65fdd86b, ...]
... что явно означает, что он доставляет Iterator
, который повторяет более чем Collection
только одного Closure
.
Итак, вкратце, как я могу получить Iterable
от замыкания, возвращающего Iterable
?