Groovy默认方法参数

问题描述:

如何调用下面的方法def只传递interactionId,transactionId,awResponseFile,testMethodName和expectedNumberOfConsumersGroovy默认方法参数

方法高清

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) 
+0

是不可能将其他参数作为'null'传递? – iberbeu 2013-03-07 20:41:21

+0

@iberbeu no。其他人仍应采用def方法中提供的默认值。你知道我做错了什么吗? – 2013-03-07 20:42:19

+0

它看起来像第一个参数应该是'String',但是你引入了'LinkedHashMap''你确定'interactionId.persistedVersion()'返回一个String而不是'LinkedHashMap' – iberbeu 2013-03-07 20:46:55

当你inclu如果地图条目(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语法。如果你希望它被类型检查,那么我认为你最好使用一个对象来封装参数。

+0

地图参数的问题,是你失去了代码完成,类型检查和记录参数的标准方式。您不能使用默认密钥(不使用难看的模式),并且如果错误输入了密钥名称,则不会收到警告。 – ddimitrov 2014-08-14 06:19:22

+1

@ddimitrov,当然,它是一个键 - >值映射上的语法糖。对于类型检查和自动完成,我建议去一个类来指定params,如:'parse(new Param(host:“10.1.1.1”,port:9000))' – Will 2014-08-14 12:02:41