Mock과 Stub은 테스트에서 어떤 차이가 있나요?
답변 포인트
상호작용을 검증하는지, 정해진 응답을 제공하는지 기준으로 구분해보세요.
정답 및 해설
빠른 요약
Stub은 테스트 대상이 의존하는 객체의 응답을 미리 정해 제공하는 대역입니다. Mock은 단순 응답 제공을 넘어 특정 메서드가 어떤 인자로 몇 번 호출됐는지 같은 상호작용을 검증하는 데 사용됩니다.
Stub은 테스트 대상이 의존하는 객체의 응답을 미리 정해 제공하는 대역입니다. Mock은 단순 응답 제공을 넘어 특정 메서드가 어떤 인자로 몇 번 호출됐는지 같은 상호작용을 검증하는 데 사용됩니다. 둘 다 테스트 격리를 돕지만 목적이 다릅니다.
핵심 개념
핵심 기준은 응답 대체와 상호작용 검증의 차이입니다. 이 개념은 단순히 용어를 외우는 것보다, 어떤 문제를 줄이기 위해 등장했는지와 실제 코드나 운영 환경에서 어떤 trade-off를 만드는지 함께 이해하는 것이 중요합니다.
테스트 더블은 외부 API, 데이터베이스, 복잡한 의존성을 실제로 사용하지 않고 테스트를 단순하게 만드는 도구입니다. 하지만 무엇을 검증하려는지에 따라 Stub과 Mock을 구분해 써야 테스트 의도가 명확해집니다.
동작 흐름
- 테스트 대상의 외부 의존성을 파악합니다.
- 결과 상태만 검증하면 Stub으로 필요한 응답을 제공합니다.
- 호출 여부나 인자까지 중요하면 Mock으로 상호작용을 검증합니다.
- 테스트가 구현 세부사항에 과하게 묶이지 않는지 확인합니다.
실제 예시
const sendEmail = vi.fn();
await signup({ email: 'user@example.com' }, { sendEmail });
expect(sendEmail).toHaveBeenCalledWith('user@example.com');회원가입 후 이메일 발송 함수가 올바르게 호출됐는지 확인하는 것은 Mock의 대표적인 사용 예입니다.
실무에서 주의할 점
- 상호작용 검증을 과하게 쓰면 리팩터링에 취약한 테스트가 됩니다.
- Stub 응답이 실제 API와 달라지면 테스트 신뢰도가 낮아집니다.
- 가능하면 중요한 비즈니스 결과를 함께 검증하는 것이 좋습니다.
함께 연결해서 보면 좋은 키워드
테스트, Mock, Stub, 테스트더블
면접에서 짚으면 좋은 포인트
- Stub은 상태 기반 검증, Mock은 상호작용 검증에 가깝다고 정리하면 구분이 쉽습니다.
- Mock 남용은 구현 세부사항에 묶인 테스트를 만들 수 있으므로 비즈니스 결과 검증과 균형을 맞춰야 합니다.
정리
한 줄로 정리하면, Stub은 정해진 응답을 제공하는 데 초점이 있고, Mock은 의존성과의 호출 상호작용을 검증하는 데 초점이 있습니다. 실무에서는 개념을 적용하는 조건과 적용하지 않았을 때 생기는 문제까지 함께 이해하는 것이 중요합니다.