솔직히 말하자면

작은 테스트

그럼 이제 첫 번째 테스트를 다시 들여다 보자. 어떤 식으로 접근할 수 있을까?

아직 작은 단계 하나로 구현하는 테스트를 작성해낼 수 있을 지 확실치 않다.

따라서 첫 번째 테스트는 더 세분화된 작은 단계를 필요하다. 즉, 큰 테스트를 공략할 수 없기때문에 진전을 나타낼 수 있는 자그마한 테스트를 만들어야 한다.

그럼 무엇이 필요한가?

만약 다른 화폐 단위인 CHF 대한 Franc 객체가 있다면, 단위가 섞인 덧셈 테스트를 작성하는 데 조금 더 가까워 질 것이다. 테스트 목록에 추가하고 진행해보자.

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

  • $5 * 2 = 10$

  • amount를 private으로 만들기

  • Dollar 부작용(side effect)?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

  • 5CHF * 2 = 10CHF

테스트 주기에 맞춰 비슷한 시나리오인 Dollar 테스트를 복사한 후 Franc 타입으로 수정해보자.

@Test
void testFrancMultiplication() {
    Franc five = new Franc(5);
    assertEquals(new Franc(10), five.times(2));
    assertEquals(new Franc(15), five.times(3));

}

당연히 컴파일 에러가 발생한다.

에러를 하나씩 제거해보자.

우선 비슷한 Dollar 코드를 복사해서 Franc으로 변경하면 에러는 사라질 것이다.

public class Franc {
    private int amount;

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

    }

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

    }

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

    }

}

또한, 테스트 또한 성공하는 것을 확인할 수 있다.

이러한 복사 & 붙여넣기 과정을 비웃는 독자들이 있을 것이다.

그러나 켄트벡은 아래 테스트 주기의 각 단계는 서로 다른 목적이 있으며, 처음 네 단계는 빠르게 진행해야 한다고 말하고 있다. 그리고 다섯번째 단계에서 앞의 네 단계에서 저지른 죄악을 해결해야만 말한다.

적절한 시기에 적절한 설계를.

돌아가게 만들고 올바르게 만들어라.

요약

자, 지금까지 Franc 화폐 단위를 지원하기 위해 중복을 엄청나게 만들어내었다.

따라서, 다음 테스트를 진행하기에 앞서 이러한 중복을 모두 제거해야만 한다.

할일 목록을 업데이트 해보도록하자.

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

  • $5 * 2 = 10$

  • amount를 private으로 만들기

  • Dollar 부작용(side effect)?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

  • 5CHF * 2 = 10CHF

  • Dollar/Franc 중복

  • 공용 equals

  • 공용 times

Last updated

Was this helpful?