프라이버시

  • $5 + 10CHF = $10(환율이 2:1 일 경우)

  • $5 * 2 = 10$

  • amount를 private으로 만들기

  • Dollar 부작용(side effect)?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

이제 동치성 문제를 정의했으므로 이를 이용하여 테스트가 좀 더 많은 이야기를 해줄 수 있도록 만들 수 있을 것이다.

@Test
void testMultiplication() {
    Dollar five = new Dollar(5);
    Dollar ten = five.times(2);
    assertEquals(10, ten.amount);
    Dollar fifteen = five.times(3);
    assertEquals(15, fifteen.amount);

}

개념적으로 Dollar.times() 연산은 현재 Dollar 객체 값에 multiplier 인자를 곱한 새로운 Dollar 객체를 반환해야 한다. 하지만 위 테스트에서는 Dollar 객체 간 동치성이 아닌, 상태 값을 비교하고 있다.

따라서, 테스트 대상을 다시 변경하여 시나리오를 아래와 같이 재작성할 수 있을 것이다.

@Test
void testMultiplication() {
    Dollar five = new Dollar(5);
    Dollar ten = five.times(2);
    assertEquals(new Dollar(10), ten);
    Dollar fifteen = five.times(3);
    assertEquals(new Dollar(15), fifteen);
    
}

이제 임시 변수는 필요가 없어 보이므로 제거하여 인라인 시켜보자.

@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;

    public Dollar(int amount) {
        this.amount = amount;

    }

    public Dollar times(int multiplier) {
        return new Dollar(amount * multiplier);

    }

    public boolean equals(Object object) {
        Dollar dollar = (Dollar) object;
        return amount == dollar.amount;

    }

}
  • $5 + 10CHF = $10(환율이 2:1 일 경우)

  • $5 * 2 = 10$

  • amount를 private으로 만들기

  • Dollar 부작용(side effect)?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

여기서 위험한 상황을 만들었다는 점에 주목해야 된다.

만약 동치성 테스트가 실패하게 된다면, 자연스럽게 곱하기 테스트 역시 실패하게 될 것이다.

켄트벡은 이 점에 대해 "TDD를 하면서 적극적으로 관리해야 할 요소" 라고 말하며, 실패한 추론을 통해 교훈을 얻고 다시 앞으로 나아가라는 용기를 심어주고 있다..

Last updated