Mock, Stub 의 차이
mock과 stub은 테스트에서 외부 의존성을 대체하기 위해 쓰이는 객체인데, 둘은 목적과 기능 면에서 조금 달라요.
📌 요약 비교
| 항목 | Stub | Mock |
|---|---|---|
| 목적 | 고정된 값 반환 (단순 대체) | 동작 검증 + 유연한 설정 |
| 기능 | 미리 정의된 응답 제공 | 호출 여부, 호출 횟수, 파라미터 검증 등 가능 |
| 테스트 타입 | 주로 상태 기반 테스트 (State-based) | 주로 행위 기반 테스트 (Behavior-based) |
| 예시 | “이 메서드가 호출되면 무조건 이 값을 리턴” | “이 메서드가 정확히 한 번 호출됐는지 확인하자” |
🔹 Stub: 단순하게 리턴값만 정해놓은 가짜
- 실제 메서드 로직은 필요 없고, “이 값을 주면 이 값을 돌려줘!” 같은 간단한 대체품.
- 주로 “기존 시스템에서 이거만 제대로 동작하면 돼"라는 테스트에 사용.
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
🔸 Mock: 행위(호출 여부 등)까지 확인하는 가짜
- 리턴값도 정의할 수 있지만, “정말로 이 메서드가 호출됐는가?” 같은 검증도 가능.
verify()같은 메서드를 통해 테스트의 정확성을 높임.
verify(userRepository, times(1)).findById(1L);
✅ 실제 테스트 예시
@Mock
UserRepository userRepository;
@InjectMocks
UserService userService;
@Test
void testUserFetch() {
// Stub: 리턴값 지정
when(userRepository.findById(1L)).thenReturn(Optional.of(new User("Alice")));
// 메서드 실행
User user = userService.getUser(1L);
// Mock: 호출 여부 검증
verify(userRepository, times(1)).findById(1L);
}
📎 간단 비유
- Stub: “누가 와도 무조건 이 대사만 말해!”
- Mock: “누가 오면 이 대사를 하고, 제대로 말했는지 검사도 합니다.!”