2016-04-28 6 views
7

Я хочу иметь простой способ для создания тестовых данных и нашел, что шаблон Builder подходит, как описано here. Однако для того, чтобы еще больше уменьшить коды шаблонов в тестах компонентов, я нашел @Builder из Project Lombok, чтобы стать хорошим кандидатом. Однако я не могу найти какие-либо документы или онлайн-примеры того, как использовать его для метода. Я хочу использовать @Builder для своего рода заводского метода, так как я не могу внести никаких изменений в реализацию.Как использовать аннотацию Lombok @Builder по методам

Может ли кто-нибудь дать пример о том, как использовать @Builder для использования по методу?

+0

почему вы хотите использовать на методы? пример использования для класса. –

+0

, потому что я не имею доступа к классу и не могу вносить в него никаких изменений. – user3139545

ответ

11
import static org.junit.Assert.*; 
import lombok.Builder; 
import lombok.Value; 

import org.junit.Test; 

@SuppressWarnings("javadoc") 
public class ImmutableAnimals { 

    @Builder(builderMethodName = "dogBuilder") 
    public static Dog newDog(String color, String barkSound) { 
     return new Dog(color, barkSound); 
    } 

    @Builder(builderMethodName = "catBuilder") 
    public static Cat newCat(String color, String meowSound) { 
     return new Cat(color, meowSound); 
    } 

    public static interface Animal { 
     String getColor(); 
    } 

    @Value 
    public static class Cat implements Animal { 
     String color; 
     String meowSound; 
    } 

    @Value 
    public static class Dog implements Animal { 
     String color; 
     String barkSound; 
    } 

    @Test 
    public void testDog() { 
     final String expectedBarkSound = "woof"; 
     final String expectedColor = "brown"; 

     final Dog dog = Animals.dogBuilder() 
      .barkSound(expectedBarkSound) 
      .color(expectedColor) 
      .build(); 

     assertEquals(expectedBarkSound, dog.getBarkSound()); 
     assertEquals(expectedColor, dog.getColor()); 
    } 

    @Test 
    public void testCat() { 
     final String expectedMeowSound = "purr"; 
     final String expectedColor = "white"; 

     final Cat cat = Animals.catBuilder() 
      .meowSound(expectedMeowSound) 
      .color(expectedColor) 
      .build(); 

     assertEquals(expectedMeowSound, cat.getMeowSound()); 
     assertEquals(expectedColor, cat.getColor()); 
    } 
} 
import static org.junit.Assert.*; 
import lombok.Builder; 
import lombok.Data; 

import org.junit.Test; 

@SuppressWarnings("javadoc") 
public class MutableAnimals { 

    @Builder(builderMethodName = "dogBuilder") 
    public static Dog newDog(String color, String barkSound) { 
     final Dog dog = new Dog(); 
     dog.setBarkSound(barkSound); 
     dog.setColor(color); 
     return dog; 
    } 

    @Builder(builderMethodName = "catBuilder") 
    public static Cat newCat(String color, String meowSound) { 
     final Cat cat = new Cat(); 
     cat.setMeowSound(meowSound); 
     cat.setColor(color); 
     return cat; 
    } 

    public static interface Animal { 
     String getColor(); 
    } 

    @Data 
    public static class Cat implements Animal { 
     String color; 
     String meowSound; 
    } 

    @Data 
    public static class Dog implements Animal { 
     String color; 
     String barkSound; 
    } 

    @Test 
    public void testDog() { 
     final String expectedBarkSound = "woof"; 
     final String expectedColor = "brown"; 

     final Dog dog = MutableAnimals.dogBuilder() 
      .barkSound(expectedBarkSound) 
      .color(expectedColor) 
      .build(); 

     assertEquals(expectedBarkSound, dog.getBarkSound()); 
     assertEquals(expectedColor, dog.getColor()); 
    } 

    @Test 
    public void testCat() { 
     final String expectedMeowSound = "purr"; 
     final String expectedColor = "white"; 

     final Cat cat = MutableAnimals.catBuilder() 
      .meowSound(expectedMeowSound) 
      .color(expectedColor) 
      .build(); 

     assertEquals(expectedMeowSound, cat.getMeowSound()); 
     assertEquals(expectedColor, cat.getColor()); 
    } 
} 
+0

Не могли бы вы объяснить, почему @Value необходимо? – user3139545

+0

@Value создает окончательный объект неизменяемого значения с помощью методов доступа (getters), всех конструкторов args, equals(), hashCode() и toString(). Я просто сделал это для удобства в этом примере. – Jeff

+0

Могу ли я использовать @Builder на mutable classea с сеттерами? – user3139545

18

Так вы используете @Builder.

//Employee.Java 
import lombok.Builder; 
import lombok.ToString; 

@Builder 
@ToString 
public class Employee { 
    private final String empName; 
    private final int salary; 
} 

// Main.java 

public class Main { 

public static void main(String[] args) { 
    Employee emp = Employee.builder().empName("Deendaya").salary(100).build(); 
    System.out.println(emp); 
    } 
} 
+0

Довольно аккуратное объяснение. – whitehat

+0

Это не отвечает на вопрос: может ли кто-нибудь дать пример о том, как реально использовать @Builder по методу? – Jeff

+0

Это правильный ответ и [здесь] (https://projectlombok.org/features/Builder), вам сообщается ясный пример: 'Person.builder(). Name (« Adam Savage »). City (" San Francisco ") .job (« Mythbusters »). job (« Unchained Reaction »). build();' может использоваться, если вы добавите аннотацию @Builder к классу 'Person'. – russellhoff