[우테코 리뷰 블로그 Javable] Test Double을 알아보자

테스트가 수행될 수 있도록 의존 오브젝트에서 테스트 대상 오브젝트로 넘겨줄 값을 제공해주는 스텁.
의존 오브젝트에게 넘겨주는 값까지 확인이 가능한 목 오브젝트
차이점 한줄 요약 :
Stub 은 테스트 대상 오브젝트의 메서드를 테스트할 수 있도록 의존 오브젝트에 입,출력값을 제공하고 제공받도록 함
Mock 은 거기에 더해서 테스트 대상 오브젝트와 의존 오브젝트 사이의 커뮤니케이션 내용을 저장해두었다가 테스트 결과 검증에 활용할 수 있음
- #테스트 오브젝트, #의존 오브젝트
- 테스트 환경을 만들어주기 위해, 테스트 오브젝트의 기능에만 충실하게 수행하면서 빠르게, 자주 테스트를 실행할 수 있도록 사용하는 오브젝트를 통틀어서
테스트 대역
(test double)이라 부름 - 테스트가 수행될 수 있도록 의존 오브젝트에 간접적으로 입력 값을 제공해주는
Stub
- 간접적인 출력 값까지 확인이 가능한
Mock
Stub
- 테스트 스텁은 테스트 대상 오브젝트의 의존객체로서 존재하면서 테스트 동안에 코드가 정상적으로 수행할 수 있도록 돕는 것을 말함
- 많은 경우, 테스트 스텁이 결과를 돌려줘야 할 때도 있음. 호출만 하면 그만인 것도 있지만(예:
MailSender
) 리턴 값이 있는 메서드를 이용하는 경우에는 결과가 필요함 - 이럴 땐 스텁에 미리 테스트 중에 필요한 정보를 리턴해주도록 만들 수 있음
- 또는 어떤 스텁은 메소드를 호출하면 강제로 예외를 발생시키게 해서 테스트 대상 오브젝트가 예외상황에서 어떻게 반응할지를 테스트할 때 적용할 수도 있음
Mock
- 테스트 대상 오브젝트의 메소드가 돌려주는 결과뿐 아니라 테스트 오브젝트가 간접적으로 의존 오브젝트에 넘기는 값과 그 행위 자체에 대해서도 검증하고 싶다면, 목 오브젝트(mock object)를 이용
- Mock : 테스트 대상의 간접적인 출력 결과를 검증하고, 테스트 대상 오브젝트와 의존 오브젝트 사이에서 일어나는 일을 검증할 수 있도록 특별히 설계
- 목 오브젝트는 스텁처럼 테스트 오브젝트가 정상적으로 실행되도록 도와주면서, 테스트 오브젝트와 자신의 사이에서 일어나는
커뮤니케이션 내용을 저장해뒀다가 테스트 결과를 검증하는 데 활용할 수 있게 해줌
- 보통의 테스트 방법으로는 검증하기가 매우 까다로운 테스트 대상 오브젝트의 내부에서 일어나는 일이나 다른 오브젝트 사이에서 주고받는 정보까지 검증하는 일이 손쉬워짐
Stub vs Mock

- 테스트 대상은 의존 오브젝트에게 값을 넘겨주기도 하고 값을 넘겨받기도 한다.
- 의존오브젝트에게 넘겨주는 값은 무시한다고 칠 수 있지만, 간접적으로 테스트 대상이 넘겨 받아야 할 값은 필요함
- →이 때 별도로 준비해둔 스텁 오브젝트가 메소드 호출 시 특정 값을 리턴하도록 만들어줌
- 떄로는 테스트 대상 오브젝트가 의존 오브젝트에게 넘겨준 값에 관심이 있을 경우가 있다.
- 혹은, 의존 오브젝트를 얼마나 사용했는가 하는 커뮤니케이션 행위 자체에 관심이 있을 수가 있다.
- 문제는 이 정보는 테스트에서는 직접 알 수가 없다는 점.
- ⇒ 이 때, 테스트 대상과 의존 오브젝트 사이에 주고 받는 정보를 보존해두는 기능을 가진 테스트용 의존 오브젝트인 목 오브젝트를 만들어서 사용해야 한다.
- 테스트 대상 오브젝트의 메소드 호출이 끝나고 나면 테스트는 목 오브젝트에게 테스트 대상과 목 오브젝트 사이에서 일어났던 일에 대해 확인을 요청해서, 그것을 테스트 검증 자료로 삼을 수 있음
상태 검증
: 메서드가 수행된 후, 객체의 상태를 확인하여 올바르게 동작 했는지를 확인하는 검증법임
행위 검증
: 메소드의 리턴 값으로 판단할 수 없는 경우 특정 동작을 수행하는 지 확인하는 검증법임