[테스트 주도 개발] 16장_드디어, 추상화

Expression.plus 를 끝내려면, Sum.plus() 를 구현해야한다. 그리고, Expression.times() 를 구현하면 끝난다. 다음은 Sum.plus() 테스트다.

1
2
3
4
5
6
7
8
9
10
11
@Test
void testSumPlusMoney() {
Expression fiveBucks = Money.dollar(5);
Expression tenFrancs = Money.franc(10);
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Expression sum = new Sum(fiveBucks, tenFrancs).plus(fiveBucks);
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(15), result);

}

테스트가 코드보다 더 길다. 그리고 코드는 Money 의 코드와 똑같다.

1
2
3
4
5
//Sum
@Override
public Expression plus(Expression addend) {
return new Sum(this, addend);
}

일단, Sum.times() 가 작동하게 된다면, Expression.times() 를 선언하는 일은 쉽다. 테스트는,

1
2
3
4
5
6
7
8
9
10
@Test
void testSumTimes(){
Expression fiveBucks = Money.dollar(5);
Expression tenFrancs = Money.franc(10);
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Expression sum = new Sum(fiveBucks, tenFrancs).times(2);
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(20), result);
}
1
2
3
4
5
6
//Sum
Expression times(int multiplier) {
return new Sum(
augend.times(multiplier), addend.times(multiplier)
);
}

이제 컴파일되게 만들려면, Expression 에 times() 를 선언해야한다.

1
2
3
4
5
6
7
interface Expression {
Money reduce(Bank bank, String to);

Expression plus(Expression addend);

Expression times(int multiplier);
}

위 작업 때문에, Money.times() 와 Sum.times() 의 가시성을 높여야한다.

1
2
3
4
//Money
public Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
1
2
3
4
5
6
//Sum
public Expression times(int multiplier) {
return new Sum(
augend.times(multiplier), addend.times(multiplier)
);
}

테스트가 통과한다.


테스트 주도 개발 <켄트 벡>

Comments