📌 amount를 private로 만들기
- Dollar.times() 연산은 호출받은 객체 값에 인자로 받은 곱수 많큼 곱한 값을 갖는 Dollar를 반환해야 한다.
- 현재의 테스트가 정확히 그것을 말한다고 보기 어려우므로 수정이 필요하다.
@Test
void testMultiplication() {
Dollar five = new Dollar(5);
Dollar product = five.times(2);
assertEquals(new Dollar(10), product);
product = five.times(3);
assertEquals(new Dollar(15), product);
}
임시 변수인 product는 쓸모가 없어졌으므로 inline 시키면 아래처럼 바뀐다.
@Test
void testMultiplication() {
Dollar five = new Dollar(5);
assertEquals(new Dollar(10), five.times(2));
assertEquals(new Dollar(15), five.times(3));
}
- 일련의 오퍼레이션이 아닌, 참인 명제에 대한 단언들이므로 의도를 더 명확하게 표현한다.
- Dollar의 amount 인스턴스 변수를 사용하는 코드는 Dollar 자신밖에 없으므로 변수를 private으로 변경할 수 있다.
public class Dollar {
private int amount;
...
}
$5 + 10CHF = $10(환율이 2:1일 경우)$5 * $2 = $10amount를 private로 만들기Dollar 부작용?
Money 반올림?equals()
hashCode()
Equal null
Equal object
🚨 주의
지금 위험한 상황을 만들었다는 점에 주의하라.
만약 동치성에 대한 코드가 정확히 작동한다는 것을 테스트가 실패한다면, 곱하기 테스트 역시 곱하기에 대한 코드가 정확하게 작동한다는 것을 검증하는 데 실패하게 된다.
이는 TDD를 하면서 적극적으로 관리해야 할 위험 요소다.
📌 정리
- 오직 테스트를 향상시키기 위해서만 개발된 기능을 사용했다.
- 두 테스트가 동시에 실패하면 망한다는 점을 인식했다.
- 위험 요소가 있음에도 계속 진행했다.
- 테스트와 코드 사이의 결합도를 낮추기 위해, 테스트하는 객체의 새 기능을 사용했다.