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);
 
}

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*