Tarun
Tarun

Reputation: 3506

Number of parameters in method

I have Selenium test which fills a form. I have a method for it but this method has overgrown in terms of number of parameters -

 newMerchantPage.addEditMerchant(merchantDomain, merchantName,
            merchantCategory, true, merchantDescription, merchantNotes,
            merchantTags, true, true, false, false, merchantTitle,
            additionalDescription, merchantHeading, dummyCouponLink, true);

There are only Strings and boolean. I was thinking to use collection and then iterate through collection in called method to do some more processing. Though yet not sure if this is the way to go about. Any recommendations?

MODIFIED METHOD:

After implementing couple of sugggestions my method (of a different method) call looks like -

ContactPage contactPage = new ContactPage(driver); 
setContactFormData(); 
contactPage.setName(name).setEmailAddress(emailAddress).setSubject(subject).setM‌ ​essage(message); 
contactPage.submitContactForm(contactPage); 

submitContactForm in turn calls different utility methods. How bad does it look? Especially the last line (method call on object and same object being passed as argument) ?

Upvotes: 4

Views: 172

Answers (4)

Ashkan Aryan
Ashkan Aryan

Reputation: 3534

I'm assuming that you are using Selenium server (or RC).

The suggestions for wrapping the data up into a Merchant class are all good and make sense, especially from pure Java coding point of view.

However, your main point of concern here in Selenium is the form you are filling, rather that the merchant domain object.

Maybe you could then break your method up into smaller methods such as openMerchantForm(...) typeNameInMerchantForm(...) chooseMerchantCategory(...)

and so on, depending on what type of control is being set on the form. That will reflect the behaviour you are testing rather than setting the domain objects directly etc.

Hope that helps.

Upvotes: 2

aioobe
aioobe

Reputation: 421280

One common approach is to wrap the parameters in a class. This class could then provide set-methods which return this to allow for a nice chaining. (See ProcessBuilder for a good example.)

Example:

MerchantData data = new MerchantData();   // initialize with sensible defaults

data.setDomain("example.com")
    .setName("Some Name")
    .setTags("tag1, tag2);

newMerchantPage.addEditMerchant(data);

Upvotes: 5

Amanpreet
Amanpreet

Reputation: 526

Have you considered making a class that is if the parameters you specify belong to something same,then pass the object as the parameter.

Upvotes: 0

Andreas Dolk
Andreas Dolk

Reputation: 114817

Maybe - write a class Merchant, create an instance with the method value and pass the instance instead?

newMerchantPage(Merchant merchant);

The advantage: you can keep the test parameters in files and do something like:

Merchant merchant = new Merchant();
merchant.populate(File testdata, int record);

Upvotes: 1

Related Questions