mockear todo. Una muy buena idea es construir nuestros objetos con builders. A la vez podemos reutilizar estos builder en diferentes tests.
Una idea muy buena son los ExpressionBuilders, que son builders que simulan un DSL para construir objetos. Es muy Elegante:
customer.newOrder()
.with(6, "TAL")
.with(5, "HPK").skippable()
.with(3, "LGV")
.priorityRush();
Esto se logra haciendo que el builder contenga la instancia que debe construir y cada vez que se llama a with o otro método que setea la instancia, devolvemos this, para poder encadenar los llamados.
Queda de esta forma:
public class OrderBuilder {
private Order subject = new Order();
private OrderLine currentLine;
public OrderBuilder with(int quantity, String productCode) {
currentLine = new OrderLine(quantity, Product.find(productCode));
subject.addLine(currentLine);
return this;
}
public OrderBuilder skippable() {
currentLine.setSkippable(true);
return this;
}
public OrderBuilder priorityRush() {
subject.setRush(true);
return this;
}
public Order getSubject() {
return subject;
}
}
Por supuesto que esta técnica no solo se puede utilizar en unit test...