sábado, 4 de octubre de 2014

ExpressionBuilder

Cuando realizamos Unit test necesitamos crear componentes o objetos para testear, no se puede
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...