Mock, Stub, Fake
한 줄 정의
Mock, Stub, Fake는 테스트에서 실제 의존성을 대체하는 객체이며, 각각 상호작용 검증, 고정 응답 제공, 단순 구현체 제공에 초점이 있다.
실무에서 왜 문제 되는가
- 모든 의존성을 mock으로 바꾸면 실제 동작과 다른 테스트가 된다.
- 상호작용 검증이 과하면 리팩터링 때 테스트가 쉽게 깨진다.
- 외부 API 실패, timeout, retry 같은 경계 상황은 대역 없이는 재현하기 어렵다.
- fake 구현이 실제 저장소와 너무 다르면 잘못된 신뢰를 준다.
실무 판단 기준
| 대역 | 사용 상황 |
|---|---|
| Stub | 특정 입력에 고정 응답이 필요할 때 |
| Mock | 특정 호출이 발생해야 하는지 검증할 때 |
| Fake | 메모리 저장소처럼 단순 동작 구현이 필요할 때 |
| Spy | 실제 객체 일부 동작을 관찰할 때 |
자주 나는 실수
- 결과 검증보다 메서드 호출 여부만 검증한다.
- private 구현 흐름에 가까운 호출 순서를 테스트한다.
- DB 동작을 fake repository로만 검증한다.
- mock 설정이 테스트 본문보다 길어져 의도를 숨긴다.
확인 방법
- 테스트가 행위 결과를 검증하는지, 구현 세부사항을 검증하는지 확인한다.
- mock을 제거해도 단위 로직을 검증할 수 있는지 본다.
- fake와 실제 구현의 차이가 중요한 위험을 숨기지 않는지 확인한다.
핵심 요약
테스트 대역은 실제 의존성을 대체해 테스트 범위와 실패 조건을 제어한다.
Stub은 응답을 제공하고 Mock은 상호작용을 검증한다.
Fake는 간단한 실제 구현이지만 실제 인프라와 차이가 있다.
상호작용 검증은 필요한 경우에만 사용해야 한다.
DB, transaction, lock 같은 동작은 fake나 mock만으로 충분하지 않을 수 있다.
꼬리 질문
- Mock과 Stub은 무엇이 다른가?
- Mock을 과하게 사용하면 어떤 문제가 생기는가?
- Fake repository는 언제 위험한가?