Как изменить «поставщик данных», возвращаемый из замыкания, в «поставщик данных»? - PullRequest
0 голосов
/ 06 мая 2018

Это в контексте «управляемого данными» тестирования с помощью Спока:

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?

1 Ответ

0 голосов
/ 06 мая 2018

Если вы не поставили здесь цели отсроченного выполнения, я считаю, что просто выполнение закрытия должно сделать:

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

Но учтите, что это выполнит его в операторе.

...