I have a testing project, in Katalon Studio, that uses data classes, called models. This is a conscious design decision.
Also a conscious design decision, is the decision to separate the concern of creating models from the concern of the test(s) that uses them. For this, for the most part, I use model factories that have methods to return the model specific to that test.
I'm doing what I outline here
For example, I have a method on my MemberLeadFactory
for each scenario with the contact phone number field .
As a matter of fact, that factory in particular has 30 methods in it. I wish to create another one, that simply takes a list of family members, and creates a list of family member leads from them .
Here is the full factory:
public class MemberLeadFactory extends BaseModelFactory<MemberLeadModel> {
@Override
public MemberLeadModel createSanityCase() {
String firstName = SMDStringUtils.CreateFirstName(),
lastName = SMDStringUtils.CreateLastName();
return new MemberLeadModel(firstName,
lastName,
new ContactInfoFactory().createRandomForPerson(firstName, lastName),
MemberCategory.MEMBERSHIP,
SMDDateUtils.DOBForStandardMember(),
SMDDateUtils.WithinLastMonth(),
Frequency.ANNUAL,
MemberContractSignatureMode.ByPost,
PaymentMode.CHECK,
);
}
public MemberLeadModel createDummyModel() {
return this.createSanityCase();
}
public MemberLeadModel createWithStartDate(Date startDate) {
MemberLeadModel model = this.createDummyModel();
model.setContractStartDate(startDate);
return model;
}
public MemberLeadModel createBackdatedModel(String firstName, String lastName) {
return this.createBackdatedModel(firstName, lastName, MemberLeadCallbackFactory.OnRandomBackdate())
}
public MemberLeadModel createBackdatedModel(String firstName, String lastName, Closure<MemberLeadModel> onBackdateModel) {
MemberLeadModel model = this.createDummyModel();
model.setFirstName(firstName);
model.setLastName(lastName);
model.getContactInfo().setEmail(SMDEmailUtils.CreateEmailFor(firstName, lastName));
return onBackdateModel(model);
}
public MemberLeadModel createMainFamilyMemberLead() {
return this.createMainFamilyMemberLead("Main", "Member", null);
}
public MemberLeadModel createMainFamilyMemberLead(Closure<MemberLeadModel> onBackdateModel) {
return this.createMainFamilyMemberLead("Main", "Member", onBackdateModel);
}
public MemberLeadModel createMainFamilyMemberLead(String firstName, String lastName, Closure<MemberLeadModel> onBackdateModel) {
MemberLeadModel model = this.createWithName(firstName, lastName, onBackdateModel);
model.setMemberLeadType(MemberLeadType.FAMILY);
model.setMemberType(MemberType.INDIVIDUAL);
return model;
}
public MemberLeadModel createWithName(String firstName, String lastName, Closure<MemberLeadModel> onBackdateModel) {
if (onBackdateModel != null)
return this.createBackdatedModel(firstName, lastName, onBackdateModel);
MemberLeadModel model = this.createDummyModel();
model.setFirstName(firstName);
model.setLastName(lastName);
return model;
}
public MemberLeadModel createFamilyMemberLead(String firstName, String lastName, boolean isPediatric, BaseMemberModel mainMemberModel) {
return this.createFamilyMemberLead(firstName, lastName, isPediatric, mainMemberModel, null)
}
public MemberLeadModel createFamilyMemberLead(String firstName, String lastName, boolean isPediatric, BaseMemberModel mainMemberModel, Closure<MemberLeadModel> onBackdateModel) {
MemberLeadModel model = this.createWithName(firstName, lastName, onBackdateModel);
model.setMemberLeadType(MemberLeadType.FAMILY);
model.setMemberType(MemberType.FAMILY);
model.setRelatedFamily(SMDStringUtils.GetFullName(mainMemberModel));
if (isPediatric) {
model.setCategory(MemberCategory.PEDIATRIC);
model.setDob(SMDDateUtils.DOBForPediatric());
}
return model;
}
public MemberLeadModel createFrequencyBased(Frequency frequency, String firstName, String lastName) {
MemberLeadModel model = this.createBackdatedModel(firstName, lastName);
model.getContactInfo().setMobilePhoneNumber(SMDNumberUtils.TenDigitPhoneNumber());
model.setFrequency(frequency);
return model;
}
public MemberLeadModel createWithAlphabeticDOB() {
return this.createBackdatedModel("Alphabetic", "DateOfBirth");
}
public MemberLeadModel createWithImproperDOBFormat() {
return this.createBackdatedModel("Improper", "DateOfBirth_Format");
}
public MemberLeadModel createWithUpcomingBirthday() {
MemberLeadModel model = this.createBackdatedModel("Upcoming", "Birthday");
model.setDob(SMDDateUtils.DOBForUpcomingBirthday());
return model;
}
public MemberLeadModel createWithFutureBirthdate() {
MemberLeadModel model = this.createBackdatedModel("Future", "Birthdate");
model.setDob(SMDDateUtils.GetFutureDOB());
return model;
}
public MemberLeadModel createWithTooShortPhoneNumber() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("PhoneNumber");
model.setLastName("TooShort");
model.getContactInfo().setPhoneNumber("77777");
model.setDob(SMDDateUtils.DOB());
model.setLeadDate(new Date());
model.setPaymentMode(PaymentMode.ACH);
return model;
}
public MemberLeadModel createWith8DigitPhoneNumber() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("PhoneNumber");
model.setLastName("8Digits");
model.getContactInfo().setPhoneNumber("77777777");
model.setDob(SMDDateUtils.DOB());
model.setLeadDate(new Date());
model.setPaymentMode(PaymentMode.ACH);
return model;
}
public MemberLeadModel createWithAlphabeticPhoneNumber() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("PhoneNumber");
model.setLastName("Alphabetic");
model.getContactInfo().setPhoneNumber("PPPPLZFAIL");
model.setDob(SMDDateUtils.DOB());
model.setLeadDate(new Date());
model.setPaymentMode(PaymentMode.ACH);
return model;
}
public MemberLeadModel createWithPhoneNumberWithSlashes() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("PhoneNumber");
model.setLastName("ContainsSlashes");
model.getContactInfo().setPhoneNumber("317/555.5555");
model.setDob(SMDDateUtils.DOB());
model.setLeadDate(new Date());
model.setPaymentMode(PaymentMode.ACH);
return model;
}
public MemberLeadModel createWithoutDomainExtension() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("NoEmail");
model.setLastName("DomainExtension");
model.getContactInfo().setEmail("dev+FirstLast@example");
model.setDob(SMDDateUtils.DOB());
model.setLeadDate(new Date());
model.setPaymentMode(PaymentMode.ACH);
return model;
}
public MemberLeadModel createWithNullCharacterEmail() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("EmailContains");
model.setLastName("NullCharacters");
model.getContactInfo().setEmail("[email protected]\0example.com");
model.setDob(SMDDateUtils.DOB());
model.setLeadDate(new Date());
model.setPaymentMode(PaymentMode.ACH);
return model;
}
public MemberLeadModel createWithWhitespaceCharacterEmail() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("EmailContains");
model.setLastName("Whitespace");
model.getContactInfo().setEmail("[email protected] example.com");
model.setDob(SMDDateUtils.DOB());
model.setLeadDate(new Date());
model.setPaymentMode(PaymentMode.ACH);
return model;
}
public MemberLeadModel createWithNonStandardAddress() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("AddressContains");
model.setLastName("Semi-colons");
model.getContactInfo().setAddress("1222;East;53rd;Street");
return model;
}
public MemberLeadModel createWithPurelyNumericAddress() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("AddressIs");
model.setLastName("PurelyNumeric");
model.getContactInfo().setAddress("1234567890");
return model;
}
public MemberLeadModel createWithNumbersInState() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("StateContains");
model.setLastName("Numbers");
model.getContactInfo().setState("I2");
return model;
}
public MemberLeadModel createWithFakeState() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("Fake");
model.setLastName("State");
model.getContactInfo().setState("JK");
return model;
}
public MemberLeadModel createWithLettersInZipCode() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("ZipCode");
model.setLastName("ContainsLetters");
model.getContactInfo().setZip("A622O");
return model;
}
public MemberLeadModel createWithImproperZipCode() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("ZipCode");
model.setLastName("ImproperFormat");
model.getContactInfo().setZip("46220.2635");
return model;
}
public MemberLeadModel createWithNonexistentOrgName() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("Nonexistent");
model.setLastName("OrganizationName");
return model;
}
public MemberLeadModel createWithNonexistentMemberCategory() {
MemberLeadModel model = this.createDummyModel();
model.setFirstName("Nonexistent");
model.setLastName("MemberCategory");
return model;
}
}
Would this design decision necessarily be a code smell?