테스트 더블(test double)이라는 말은 스턴트 더블(stunt double)이라는 말에서 왔음
스턴트 더블은 주인공과 매우 닮은 스턴트 대역배우를 말함
출처: http://www.kickvick.com/celebrities-stunt-doubles/
테스트 더블은 테스트를 위해 가짜로 대역 노릇을 하는 객체를 의미함
- dummy
- 개체가 전달되긴 하지만 사용되지 않는 객체. 일반적으로 매개변수 목록을 채우는 용도로만 사용됨
- stub
- 미리 준비된 답변을 제공하는 객체. 테스트에 사용되는 것 이외에는 응답하지 않음
- StubAccountDAO는 계정 조회 요청 시 어떤 입력 파라미터를 받더라도 미리 준비된 { "name": "John Smith", "age": 36 }와 같은 동일한 응답만을 함
- 다른 기능에 대한 의존성을 차단하는 효과가 있음
- mock
- 수신할 것으로 예상되는 호출에 맞춰 마련된 객체
- 주로 호출이 실제로 일어났는지의 여부를 확인하는 용도로 사용됨
- MockAccountDAO는 AccountDAO가 제공하기로(그리고 테스트되어야 할) 메소드들에 대해서 호출이 실제로 있었는지의 여부만 확인함
- 다른 테스트 더블 객체은 보통 객체 개발자가 직접 만드는데 반해, mock은 mocking 기능을 제공하는 테스트 프레임웍이 제공하는 기능에 의존할 필요가 있음
- 멤버변수 객체를 mock으로 변환하고 그 mock의 메소드가 호출되었는지 여부를 검증함
- fake
- 기능은 실제로 동작하는데 프로덕션(리얼) 환경에 사용하기는 어려운 객체
- h2와 같은 in-memory test database가 대표적인 fake임
- AccountDAO가 DB를 사용하는 경우, FakeAccountDAO는 메모리 상의 HashMap으로 가짜 구현을 만들어서 사용하도록 개발될 수 있음 (기능은 실제 객체와 비슷하게 정상적인 것처럼 보이겠지만 프로덕션 환경에서는 사용 불가함)
- spy
- 호출에 사용된 정보를 기록하는 stub. 로깅이나 모니터링, 태핑을 담당함
일반적으로 혼동하는 것은 mock과 stub인데, stub은 내부에서 뭘 했는지 관심없는 객체에 해당하고 mock은 뭔가 했는지 안 했는지의 행위 여부에 관심을 가지는 객체에 해당함
- 가급적 mockito라는 테스트 프레임웍을 사용하되 stub을 사용할 것
- mock을 사용하게 되면 행위 검증을 하게 되므로 객체가 변경되면 의존성이 있으므로 mock도 수정해야 함
- mock을 사용하게 되면 이렇게 테스트케이스의 유지보수 비용이 발생하며 시간이 지남에 따라 테스트케이스가 부스러지는 경향이 있음