Employee jeff = department.employee("jeff");
jeff.giveRaise(new Cash("$5.000"));
if (jeff.performance() < 3.5) {
jeff.fire();
}
위의 예제 코드처럼 간단한 코드라면 저자가 말하는 이상적인 코드를 만드는데 힘을 많이 들이지 않아도 가능하겠지만, 보통 우리가 작성하는 코드는 저렇게 간단하지 않다고 생각한다. 테스트 코드를 잘 작성하면 문서화를 대신 하는 것 까지는 아니여도 코드를 이해하는데 훨씬 수월하다는 얘기는 많이 들었고 나도 동의한다. DisplayName이나 테스트 이름을 한글로 작성하면서 "어떤 상황에서 어떤 결과가 나와야한다." 라는 형식을 지키면서 해당 메서드가 어떤 역할을 하는지 알 수 있다고 생각한다.
class Cash {
private final Exchange exchange;
private final int cents;
public Cash(Exchange exchange, int cents) {
this.exchange = exchange;
this.cents = cents;
}
public Cash in(String currency) {
return new Cash(this.exchange,
this.cents * this.exchange.rate("USD", currency));
}
}
public interface Exchange {
float rate(String source, String target);
final class Fake implements Exchange {
@Override
float rate(String origin, String target) {
return 1.2345;
}
}
}
모킹은 구현이 조금만 바껴도 다 깨지는 위험성을 지닌걸로 알고 있다. 모킹 테스트를 사용하는 것이 아닌 페이크 객체를 사용하면 구현이 바뀌어도 영향이 가는 위험성을 조금 줄일 수 있으니 좋은 것 같다. 활용을 하려면 더 공부를 해봐야 알 것 같다.
데코레이터 패턴이 더 좋지 않을까?