【问题标题】:Groovy default method parametersGroovy 默认方法参数
【发布时间】:2013-03-07 20:16:10
【问题描述】:

如何调用下面的方法def只传递interactionId、transactionId、awResponseFile、testMethodName和expectedNumberOfConsumers

方法定义

void verifyPersistence(String interactionId, String transactionId, 
                       File rawResponseFile, String testMethodName, 
                       int expectedNumberOfDatasourceProductResponseRaws=1, 
                       String dsProductName=datasourceSpec['creditreport.name'], 
                       int expectedNumberOfDatasourceProductResponses=1, 
                       int expectedNumberOfConsumers=1, 
                       int expectedNumberOfAddresses=1 )

方法调用

verifyPersistence interactionId.persistedVersion(), transactionId, 
                  results, testName.methodName, expectedNumberOfConsumers:8

例外

groovy.lang.MissingMethodException: No signature of method: verifyPersistence() is applicable for argument types: (java.util.LinkedHashMap, java.lang.String, java.lang.String, java.io.File, java.lang.String) values: [[expectedNumberOfConsumers:8], 3130001030065, 10003000000890059, C:\results, multiple consumers contracts]
Possible solutions: 

verifyPersistence(java.lang.String, java.lang.String, java.io.File, java.lang.String), 
verifyPersistence(java.lang.String, java.lang.String, java.io.File, java.lang.String, int), 
verifyPersistence(java.lang.String, java.lang.String, java.io.File, java.lang.String, int, java.lang.String), 
verifyPersistence(java.lang.String, java.lang.String, java.io.File, java.lang.String, int, java.lang.String, int), verifyPersistence(java.lang.String, java.lang.String, java.io.File, java.lang.String, int, java.lang.String, int, int)
    at HitmultipleconsumersPersistSpec.groovy:151)

【问题讨论】:

  • 不能将其他参数作为null传递吗?
  • @iberbeu 没有。其他人仍应采用方法 def 中提供的默认值。你知道我做错了什么吗?
  • 看起来第一个参数应该是String,但你引入了LinkedHashMap,你确定interactionId.persistedVersion()返回的是String而不是LinkedHashMap

标签: groovy overloading


【解决方案1】:

当您包含映射条目 (key:value) 时,它们会被自动收集、放入哈希映射并作为第一个参数传递。 Groovy 目前还没有命名参数。对于这种特定情况,我认为您最好使用该方法的地图:

def verifyPersistence(Map map) {
  String interactionId = map.interactionId
  String transactionId = map.transactionId
  File rawResponseFile = map.rawResponseFile
  String testMethodName = map.testMethodName
  int expectedNumberOfDatasourceProductResponseRaws = map.expectedNumberOfDatasourceProductResponseRaws ?: 1
  String dsProductName = map.dsProductName ?: datasourceSpec['creditreport.name']
  int expectedNumberOfDatasourceProductResponses = map.expectedNumberOfDatasourceProductResponses ?: 1
  int expectedNumberOfConsumers = map.expectedNumberOfConsumers ?: 1
  int expectedNumberOfAddresses = map.expectedNumberOfAddresses ?: 1
}


verifyPersistence(
  interactionId : interactionId.persistedVersion(), 
  transactionId : transactionId, 
  rawResponseFile : results, 
  expectedNumberOfDatasourceProductResponseRaws : 14, 
  expectedNumberOfConsumers:8
)

您显然不需要将每个参数分配给变量,您可以简单地使用map.field 语法。如果您希望对其进行类型检查,那么我认为您最好使用对象来封装参数。

【讨论】:

  • map 参数的问题是您丢失了代码完成、类型检查和记录参数的标准方式。你不能有默认键(不使用难看的模式),如果你输入错误的键名,你不会收到警告。
  • @ddimitrov,当然,它是 key->value 映射的语法糖。对于类型检查和自动完成,我建议使用一个类来指定参数,例如:parse(new Param(host: "10.1.1.1", port: 9000))
猜你喜欢
  • 2011-11-16
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2010-10-07
  • 2012-09-18
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多