Test Data Builders z użyciem Make It Easy
Test Data Builders z użyciem Make It Easy
Test Data Builders (z ang. Appender lub z ang. Fluent Builder) to wzorzec projektowy który pozwala konstruować obiekty w sposób efektywny tj. np. bez użycia wielo-argumentowego konstruktora. W fazie testowania aplikacji wielokrotne tworzenie obiektów składających się z różnych danych w poniższy sposób jest nieefektywne i trudne w utrzymaniu:
Employee emp1 = new Employee ( new Recipient("emp1", new Address("sample street1", "City1", new PostCode("34", "852"))), Employee emp2 = new Employee ( new Recipient("emp2", new Address("sample street2", "City2", new PostCode("34", "352"))),
Próbą rozwiązania problemu jest wzorzec projektowy Object Mother. Wzorzec ten zakłada utworzenie klasy z metodami statycznymi które służyć mają do tworzenia obiektów:
Employee emp = TestEmployeeHelper.newEmp1();
Employee emp = TestEmployeeHelper.newEmp1();
A co jeśli potrzebujemy podobnego obiektu, ale w innym wariancie do testów? Trzeba tworzyć wtedy dodatkową metodę statyczną co jest niewygodne i trudne w utrzymaniu. Tutaj przychodzi rozwiązanie – wzorzec Buildera i biblioteka Make It Easy która pozwala tworzyć obiekty w sposób efektywny w różnych wariantach ograniczając do minimum tzw. z ang. boilerplate code.
Dołączamy najnowszą wersję biblioteki – na chwile pisania tego artykułu jest to wersja:
<dependency> <groupId>com.natpryce</groupId> <artifactId>make-it-easy</artifactId> <version>4.0.1</version> <scope>test</scope> </dependency>
Tworzymy podstawowy model:
@Getter @Setter @AllArgsConstructor @ToString public class Employee { String name; String surname; Double salary; }
Tworzymy tytułowy Test Data Builders:
public class InstantiatorEmployee { public static final Property<Employee,String> name = newProperty(); public static final Property<Employee,String> surname = newProperty(); public static final Property<Employee,Double> salary = newProperty(); public static final Instantiator<Employee> Employee = new Instantiator<Employee>() { @Override public Employee instantiate(PropertyLookup<Employee> lookup) { Employee employee = new Employee( lookup.valueOf(name, "Java"), lookup.valueOf(surname, "Leader"), lookup.valueOf(salary, 1000.00)); return employee; } }; }
Tworzenie instancji obiektów w testach jednostkowych wygląda następująco:
@Test public void employeeTest() { Maker<Employee> jamesMaker = an(InstantiatorEmployee.Employee, with("James", InstantiatorEmployee.name), with("Spring", InstantiatorEmployee.surname), with(5000.00, InstantiatorEmployee.salary) ); Employee james = make(jamesMaker); System.out.println(james); Maker<Employee> jamesWithSalary3000Maker = jamesMaker.but( with(InstantiatorEmployee.salary, 3000.00) ); Employee jamesWithSalary3000 = make(jamesWithSalary3000Maker); System.out.println(jamesWithSalary3000); }
Leave a comment