# 솔직히 말하자면

## 작은 테스트&#x20;

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

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

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

그럼 무엇이 필요한가?

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

{% tabs %}
{% tab title="테스트 목록" %}

* $5 + 10CHF = $10(환율이 2:1 일 경우) &#x20;
* ~~*$5 \** 2 = 10$~~&#x20;
* \~\~*amount를 private으로 만들기* \~\~&#x20;
* ~~Dollar 부작용(side effect)?~~&#x20;
* Money 반올림?
* ~~equals()~~
* hashCode()
* Equal null
* Equal object
* **5CHF \* 2 = 10CHF**
  {% endtab %}
  {% endtabs %}

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

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

}
```

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

![](https://1360705058-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZ0r85EEFTHmLyxK8ag%2F-Lsep4B6CMG88f7sTQ0j%2F-LseuQ9BgMJoiycJZTJe%2Fimage.png?alt=media\&token=2cd45ace-efaa-4866-a338-434afa3fc6cb)

에러를 하나씩 제거해보자.&#x20;

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

```java
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;

    }

}
```

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

![](https://1360705058-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LZ0r85EEFTHmLyxK8ag%2F-Lsep4B6CMG88f7sTQ0j%2F-Lsev8blc-W_rdkkXMMK%2Fimage.png?alt=media\&token=30b21997-4c78-45e1-9844-eb097ace497a)

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

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

> ***적절한 시기에 적절한 설계를.***&#x20;
>
> ***돌아가게 만들고 올바르게 만들어라.***

{% hint style="warning" %}
테스트 주기&#x20;

1. 테스트 작성
2. 컴파일 되게 하기
3. 실패하는지 확인하기 위해 실
4. 실행 가능하게 만
5. 중복 제거
   {% endhint %}

## 요약&#x20;

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

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

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

{% tabs %}
{% tab title="테스트 목록" %}

* $5 + 10CHF = $10(환율이 2:1 일 경우) &#x20;
* ~~*$5 \** 2 = 10$~~&#x20;
* \~\~*amount를 private으로 만들기* \~\~&#x20;
* ~~Dollar 부작용(side effect)?~~&#x20;
* Money 반올림?
* ~~equals()~~
* hashCode()
* Equal null
* Equal object
* ~~5CHF \* 2 = 10CHF~~
* Dollar/Franc 중복
* 공용 equals
* 공용 times
  {% endtab %}
  {% endtabs %}
