김동형수 개발기

테스트 주도 개발 - 1부 10장 본문

책 스터디/[완료] 테스트 주도 개발

테스트 주도 개발 - 1부 10장

김동형수 2022. 9. 23. 15:19

10장 흥미로운 시간

 

할일목록

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • $5 X 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용?
  • Money 반올림?
  • equals()
  • hashCode()
  • Equal null
  • Equal object
  • 5CHF X 2 = 10CHF
  • Dollar / Franc 중복
  • 공용 equals
  • 공용 times
  • Franc와 Dollar 비교하기
  • 통화?
  • testFrancMultiplication을 지워야 할까?

Dollar와 Franc 클래스를 제거하기 위한 명백한 방법이 없다.
times에서 팩토리 메서드를 호출했지만, 팩토리 메서드의 내용을 인라인 시킨다.

 

깔끔한 코드와 코드가 잘 동작할 거라는 믿음을 줄 수 있는 테스트 코드들이 있다.
고민을 하기 보다는 컴퓨터에게 물어보는 것도 좋다. (엔지니어 5~10분, 컴퓨터 10~15초)
상위 클래스를 추상클래스에서 콘크리트 클래스로 만든다.

 

org.opentest4j.AssertionFailedError: 
Expected :chapter10.Franc@5158b42f
Actual   :chapter10.Money@595b007d

컴파일러의 메시지가 도움이 크게 되는 것 같지는 않다. toString 메서드를 구현하자.

 

toString() 작성하면서 테스트 먼저 작성해야하나?

  • 우린 지금 화면에 나타나는 결과를 보려던 참이다.
  • toString()은 디버그 출력에만 쓰이기 때문에 이게 잘못 구현됨으로 얻게 될 리스크가 적다
  • 이미 삘간 막대 상태인데 이 상태에서는 새로운 테스트를 작성하지 않는 게 좋을 것 같다.

Expected :10   CHF
Actual   :10   CHF

답은 맞지만 클래스가 다르다. Franc 대신 Money가 왔다. equals에 문제가 있다.

 

equals에서 클래스가 아닌 통화단위를 비교해야 한다.

times 또한 Money로 변경할 수 있고 Dollar, Franc 코드가 동일해졌으므로 공통 클래스로 Push up 한다.

 

할일목록

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • $5 X 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용?
  • Money 반올림?
  • equals()
  • hashCode()
  • Equal null
  • Equal object
  • 5CHF X 2 = 10CHF
  • Dollar / Franc 중복
  • 공용 equals
  • 공용 times
  • Franc와 Dollar 비교하기
  • 통화?
  • testFrancMultiplication을 지워야 할까?

 

정리

  • 두 times()를 일치시키기 위해 그 메서드들이 호출하는 다른 메서드들을 인라인시킨 후 상수를 변수로 바꿔주었다.
  • 단지 디버깅을 위해 테스트 없이 toString() 작성
  • Frnac 대신 Money를 반환하는 변경을 시도한 뒤 그것이 잘 동작할지를 테스트가 말하도록 했다.
  • 실험해본 걸 뒤로 물리고 또 다른 테스트를 작성했다. 테스트를 작동했더니 실험도 제대로 작동했다.
 

 

Comments