【问题标题】:How to avoid casting arguments in Spock如何避免在 Spock 中转换参数
【发布时间】:2017-10-16 20:13:13
【问题描述】:

我想从存储库中获取一个列表并声明其内容。

在以下代码中,我收到一条警告,指出无法将 Object 分配给 List

有什么方法可以添加更好的论据来处理这种情况吗?

myDomainObjectRepository.save(_) >> { arguments ->
   final List<MyDomainObject> myDomainObjects = arguments[0]
   assert myDomainObjects == [new MyDomainObject(someId, someData)]
}

【问题讨论】:

    标签: groovy spock


    【解决方案1】:

    详细说明 Opals 答案:docs 中有两个部分和一个脚注与此处相关:

    如果闭包声明了一个无类型参数,它会通过 方法的参数列表:

    还有

    在大多数情况下,直接访问 方法的参数。如果闭包声明了多个参数或 单个类型参数,方法参数将被一一映射 关闭参数[脚注]:

    脚注:

    闭包参数的解构语义直接来自 时髦的。

    问题是您只有一个参数列表,并且由于泛型已被删除,因此常规无法确定您实际上是否要打开列表。

    所以单个非List 参数可以正常工作:

    myDomainObjectRepository.save(_) >> { MyDomainObject myDomainObject ->
       assert myDomainObject == new MyDomainObject(someId, someData)
    }
    

    List 参数结合第二个参数,例如save(List domain, boolean flush)

    myDomainObjectRepository.save(_, _) >> { List<MyDomainObject> myDomainObjects, boolean flush -> 
       assert myDomainObjects == [new MyDomainObject(someId, someData)]
    }
    

    所以文档对这种极端情况有点误导。恐怕你在这个案子的演员阵容中遇到了困难。


    编辑:如果你这样做,你应该能够摆脱 IDE 警告。

    myDomainObjectRepository.save(_) >> { List<List<MyDomainObject>> arguments ->
       List<MyDomainObject> myDomainObjects = arguments[0]
       assert myDomainObjects == [new MyDomainObject(someId, someData)]
    }
    

    【讨论】:

      【解决方案2】:

      docs 似乎是准确的:

      如果闭包声明了一个无类型参数,它会被传递给方法的参数列表

      但是,我刚刚更改了使用 rightShift + arguments 的规范来接受单个类型参数,并且它确实有效。试试看。

      【讨论】:

      • 我的代码可以工作,但 IDE 会发出警告 - 我想将其更改为无法正常工作的方式
      • @pixel 会引发什么警告?
      • Cannot assign 'Object' to 'List&lt;MyDomainObject&gt; 和另一个 getAt 不能应用于 Integer
      • 所以它不会在没有警告的情况下工作。您可以随时使用SuppressWarnings
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多