TDD 1.0 Help

4장. 프라이버시

할일 목록
  • $5 + 10CHF = $10 (환율이 2:1로 가정)

  • $5 x 2 = $10

  • amount를 private으로 만들기

  • Dollar side effect?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

동치성 문제를 정의했으므로 이를 이용해서 테스트가 조금 더 많은 이야기를 해줄 수 있도록 해보자.

개념적으로 Dollar.times() 연산은 호출을 받는 객체의 값에 인자로 받은 곱수만큼 곱한 값을 갖는 Dollar를 반환해야 한다.

@kotlin.test.Test fun testMultiplication() { val five = Dollar(5) var product = five.times(2) assertEquals(10, product.amount) product = five.times(3) assertEquals(15, product.amount) }

위 코드에서 단언(assertion)을 Dollar와 Dollar를 비교하는 것으로 재작성 할 수 있다.

@kotlin.test.Test fun testMultiplication() { val five = Dollar(5) var product = five.times(2) assertEquals(Dollar(10), product) product = five.times(3) assertEquals(Dollar(15), product) }

임시 변수인 product는 쓸모없으니 인라인시켜보자.

@kotlin.test.Test fun testMultiplication() { val five = Dollar(5) assertEquals(Dollar(10), five.times(2)) assertEquals(Dollar(15), five.times(3)) }

테스트를 고치니 이제 Dollar의 amount 인스턴스 변수를 사용하는 코드는 Dollar 자신밖에 없게 됐다. 따라서 변수를 private으로 변경할 수 있다.

class Dollar(private var amount: Int) { fun times(multiplier: Int): Dollar { return Dollar(amount * multiplier) } override fun equals(other: Any?): Boolean { return amount == (other as Dollar).amount } }
할일 목록
  • $5 + 10CHF = $10 (환율이 2:1로 가정)

  • $5 x 2 = $10

  • amount를 private으로 만들기

  • Dollar side effect?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

할일 목록의 또 다른 항목을 지울 수 있게 됐다. 하지만 위험한 상황을 만들었을 수 있다. 만약 동치성 테스트가 동치성에 대한 코드가 정확히 작동한다는 것을 검증하는 데 실패하면, 곱하지 테스트 역시 곱하기에 대한 코드가 정확하게 작동한다는 것을 검증하는 데 실패하게 된다.

이것은 TDD를 하면서 적극적으로 관리해야 할 위험 요소이다.

Last modified: 31 January 2024