솔직히 말하자면

작은 테스트

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

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

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

그럼 무엇이 필요한가?

만약 다른 화폐 단위인 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;

    }

}

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

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

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

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

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

테스트 주기

  1. 테스트 작성

  2. 컴파일 되게 하기

  3. 실패하는지 확인하기 위해 실

  4. 실행 가능하게 만

  5. 중복 제거

요약

자, 지금까지 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