2013-03-07 4 views
1

Как назвать метод ниже, чтобы пройти только interactiveId, transactionId, awResponseFile, testMethodName и expectedNumberOfConsumers?Параметры метода по умолчанию Groovy

метод Защиту

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

+0

@iberbeu no. другие должны по-прежнему принимать значения по умолчанию, указанные в методе def. Знаете ли вы, что я делаю неправильно? –

+0

Похоже, что первым параметром должен быть 'String', но вы вводите' LinkedHashMap', вы уверены, что 'actionId.persistedVersion() 'возвращает' String', а не 'LinkedHashMap' – iberbeu

ответ

4

Когда вы inclu de a map entry (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

+1

@ddimitrov, конечно, это синтаксический сахар по карте key-> value. Для проверки типов и автоматического завершения я бы рекомендовал, чтобы класс задавал параметры, например: 'parse (new Param (host:" 10.1.1.1 ", port: 9000))' – Will

Смежные вопросы