currentDay 매개변수를 추가함으로써 시간 값의 통제권을 함수 호출자(테스트 코드)에 넘겨주었다. 우리가 주입하는 것은 일반적으로 ‘더미(dummy)’라는 단순한 데이터 조각으로, 별다른 동작은 없는 코드 조각이다. 하지만 이 책에서는 더미를 ‘스텁’이라고 부르겠다.
이 접근 방식은 의존성 역전(dependency inversion)의 한 형태다. ‘제어의 역전(inversion of control)’은 1988년 존슨과 푸트가 작성한 <Designing Reusable Classes(재사용 가능한 클래스 설계)>(Johnson & Foote, 1988)9에서 처음 등장했다. ‘의존성 역전’은 로버트 C. 마틴이 2000년에 발표한 “Design Principles and Design Patterns(설계 원칙과 설계 패턴)” 논문에서 설명한 SOLID 원칙 중 하나이기도 하다. 상위 레벨의 코드를 설계할 때 고려해야 하는 사항은 8장에서 더 자세히 다룰 예정이다.
예제 3-3은 verifyPassword2() 함수에 매개변수 하나만 추가하는 단순한 작업이지만, 이는 매우 효과적인 리팩터링이다. 테스트 일관성을 확보한 것 외에도 몇 가지 장점이 있다.
• 이제 원하는 날짜를 쉽게 설정할 수 있다.
• verifyPassword2() 함수는 더 이상 날짜/시간 라이브러리를 직접 다룰 필요가 없다. 따라서 나중에 다른 라이브러리로 변경할 때 함수는 최소한의 수정만 거치면 된다.