2013-03-07 202 views
1

如何調用下面的方法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

回答

4

當你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