전체 목록
테스트Medium#243

Test Double의 Dummy, Stub, Spy, Mock, Fake를 구분해주세요.

#테스트#TestDouble#Mock#Stub

답변 포인트

대체 객체가 테스트에서 맡는 역할를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

Dummy는 전달용, Stub은 고정 응답, Spy는 호출 기록, Mock은 기대 호출 검증, Fake는 단순화된 실제 구현입니다. 역할에 따라 적절한 대체 객체를 선택합니다.

Test Double은 테스트에서 실제 의존 객체 대신 사용하는 대역을 통칭합니다. Dummy, Stub, Spy, Mock, Fake는 목적이 서로 다릅니다.

Dummy

필요해서 넘기지만 실제로 사용하지 않는 객체입니다.

TypeScript
createUser('a@example.com', {} as Logger); // logger가 호출되지 않는 테스트

Stub

정해진 값을 반환해 테스트 경로를 제어합니다.

TypeScript
userRepo.findById = async () => ({ id: 1, grade: 'VIP' });

Spy

실제 호출 정보를 기록해 나중에 확인합니다.

TypeScript
const spy = vi.spyOn(mailSender, 'send');
await service.signup(input);
expect(spy).toHaveBeenCalledTimes(1);

Mock

기대 호출과 동작을 미리 정의하고 검증합니다. 상호작용 자체가 테스트 목적일 때 사용합니다.

Fake

실제처럼 동작하지만 단순화된 구현입니다. in-memory repository가 대표적입니다.

TypeScript
class InMemoryUserRepository {
  users = new Map();
  async save(user) { this.users.set(user.id, user); }
  async findById(id) { return this.users.get(id); }
}

면접 답변 포인트

Dummy는 채우기용, Stub은 반환값 제어, Spy는 호출 기록, Mock은 기대 상호작용 검증, Fake는 동작하는 단순 구현이라고 구분하면 됩니다. 용어보다 어떤 테스트 의도를 표현하는지가 중요합니다.

관련 질문

같은 카테고리/태그 기준