Aravind Yarram
Aravind Yarram

Reputation: 80166

Groovy default method parameters

How to call the below method def to pass only interactionId, transactionId, awResponseFile, testMethodName and expectedNumberOfConsumers?

method def

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 )

method call

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

Exception

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)

Upvotes: 1

Views: 3761

Answers (1)

Will
Will

Reputation: 14519

When you include a map entry (key:value), they get automatically collected, put into a hashmap and passed as the first parameter. Groovy, right now, doesn't have named parameters. For that specific case, i think you are better using a map for that method:

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
)

You obviously don't need to assign every parameter to a variable, you can simply use the map.field syntax. If you want it to be type checked, then i think you are better using an object to encapsulate the parameters.

Upvotes: 4

Related Questions