Je souhaite disposer d’un moyen simple de construire des données de test et j’ai trouvé que le modèle Builder s’accordait parfaitement, comme décrit ci-après ici . Cependant, afin de réduire encore plus le nombre de codes habituels dans les tests de composants, j'ai trouvé @Builder de Project Lombok comme un candidat de Nice à essayer. Cependant, je ne trouve aucune documentation ou exemple en ligne sur la façon de l’utiliser sur une méthode. Je souhaite utiliser @Builder sur une sorte de méthode d'usine car je ne peux apporter aucune modification à l'implémentation.
Quelqu'un peut-il donner un exemple d'utilisation de @Builder sur une méthode?
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());
}
}
Voici comment vous utilisez @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);
}
}
Je pense que la réponse ci-dessus a complété les réponses, mais je tiens tout de même à souligner quelques points ici. Si vous utilisez un générateur, il générera ces 7 éléments, comme indiqué dans la documentation.
• Dans le générateur: un champ privé non statique non final pour chaque paramètre de la cible . • Dans le générateur: un constructeur vide privé de package no-args . Méthode similaire à chaque paramètre de la cible: elle a le même type que ce paramètre et le même nom. Il renvoie le générateur lui-même, de sorte que les appels de définition puissent être chaînés, comme dans l'exemple ci-dessus . • Dans le générateur: une méthode build () qui appelle la méthode et transmet chaque champ. Il retourne le même type que la cible .. ... • Dans le générateur: une implémentation sensible de toString () . • dans la classe contenant la cible: une méthode builder (), qui crée une nouvelle instance du générateur . • Une classe statique interne appelée FooBuilder, avec les mêmes arguments de type que la méthode statique (appelée générateur).
Lombok crée un problème lorsque vous devez écrire des scénarios de test unitaires et que votre organisation vous dit de ne pas ignorer également model/pojo. À ce stade, il est un peu fastidieux de couvrir ces méthodes générées automatiquement.