add test - VoucherPricingServiceTest

가장 먼저 변경하려는 클래스 VoucherPricingService에 대한 테스트를 추가한다.
remove unused parameter User
add failing test first - VoucherDiscountCalculationTest

VoucherPricingService.applyAdditionalDiscounts to VoucherDiscountCalculation#calculateVoucherDiscount로 extract하기 위한 첫 단계
VoucherPricingServiceTest를 복사해서 VoucherDiscountCalculationTest를 생성
VoucherDiscountCalculation를 생성할 때 VoucherService 객체를 전달하여 의존성 주입
make it pass for extract

VoucherDiscountCalculationTest에서 hot fix를 이용해서 production 클래스를 생성(class 생성, 생성자, 메소드 생성)
VoucherPricingService.applyAdditionalDiscounts의 내용을 VoucherDiscountCalculation.calculateVoucherDiscount로 복사
make it pass - change VoucherPricingService

VoucherPricingService가 VoucherDiscountCalculation를 사용하도록 변경
VoucherPricingService.applyAdditionalDiscounts에서 VoucherDiscountCalculation를 생성하고, VoucherDiscountCalculation.calculateVoucherDiscount를 호출하도록 수정
Inject - Add failing test

모든 테스트가 여전히 성공한다. 이 말은 VoucherDiscountCalculation 클래스에 동일한 행위를 가졌다는 것을 의미한다.
이제 VoucherDiscountCalculation를 클래스 계층의 최상위의 클래스인 PricingService에 주입하자.
이런 새로운 collaboration을 테스트할 수 있는 테스트를 먼저 추가하자.
Inject - make it pass
Kill

VoucherPricingService class, PricingService.applyAdditionalDiscounts template method는 더이상 사용되지 않으므로 kill한다.
VoucherPricingServiceTest도 불필요하므로 kill
PricingServiceTest에서 testable class의 applyAdditionalDiscounts() method도 kill
이젠 클래스 계층에 concrete 클래스가 하나도 없다(이전까진 VoucherPricingService가 유일했다).  UserDiscountPricingService를 concrete class로 promote한다.
add class-diagram-3.png
add test

UserDiscountPricingService를 변경하기 전에 UserDiscountPricingService에 대한 테스트를 추가한다.
refactoring - apply UserBuilder
add failing test - PrimeUserDiscountCalculationTest

UserDiscountPricingServiceTest를 복사해서 PrimeUserDiscountCalculationTest를 추가
make it pass

UserDiscountPricingService.calculateDiscount를 PrimeUserDiscountCalculation.calculateDiscount로 복사해서 동작하도록 구현
make it pass - change UserDiscountPricingService

PrimeUserDiscountCalculation.calculateDiscount를 사용하도록 변경
Inject - Add failing test

PrimeUserDiscountCalculation를 PricingService에 주입
새로운 collaboration을 테스트할 수 있는 테스트를 먼저 추가하자.
Inject - Make it Pass
kill

UserDiscountPricingService와 이 클래스가 override하던 calculateDiscount 관련된 것들을 kill
add class-diagram-4.png