代码之家  ›  专栏  ›  技术社区  ›  mike rodent

如何将闭包返回的“数据提供程序”更改为“数据提供程序”?

  •  1
  • mike rodent  · 技术社区  · 7 年前

    这是在使用Spock进行“数据驱动”测试的背景下进行的:

    where:
    key << myDriver.myMap.keySet()
    

    。。。工作正常:关键值已交付,参数化测试工作正常。

    但如果我试试这个:

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

    它不起作用。然后对象位于 << 是一个 Closure .然后,我尝试了很多方法,试图诱使“数据提供者”摆脱这一困境 关闭

    我想首先在那里做一个闭包,这样我可以调试一点,但也可以提供一组更复杂的排列(不仅仅是“关键”值,还有其他测试参数的值……请参见我最近的一个问题 here )。

    也许这对 keySet() :原来这是 LinkedHashMap$LinkedKeySet 。。。但很明显 Iterable

    我对这个“数据提供者”类别有点困惑。在斯波克的“教程”中,它说这必须实现 可迭代的 .它并没有说这是否就是它的全部特征。离去

    { myDriver.myMap.keySet() }.iterator()
    

    没有帮助。。。 iterator() 显然可以 Iterator 可迭代的 无论如何然后我得到的是这样的恐怖:

    非常棒。lang.MissingMethodException:没有方法签名: 果心MyModule。processCommand()适用于参数类型: (core.UT\u ForMyModule$\u spock\u feature\u 1\u 12prov0\u closure8, joptsimple。OptionSet,java。util。ArrayList)值: [核心.UT\u ForMyModule$\u spock\u feature\u 1\u 12prov0_closure8@65fdd86b,…]

    。。。这显然意味着 迭代器 Collection 正好是一个 关闭

    那么,简而言之,我如何获得 可迭代的 从返回 可迭代的 ?

    1 回复  |  直到 7 年前
        1
  •  1
  •   ernest_k Petronella    7 年前

    除非您在这里延迟了执行目标,否则我认为仅仅运行关闭应该可以:

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

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

    推荐文章