Mock 이란?

정의

소프트웨어 테스트에서 실제 객체를 대신하여 사용하는 '가짜 객체'를 의미

 

사용하는 이유

  • 테스트 환경을 구현하기 힘든 경우
  • 테스트 대상이 외부 시스템과의 의존성이 높아 직접 테스트하기 힘든 경우 
  • 테스트하기 힘든 상황이 기대한 대로 상호작용하는지 검증하기 위한 경우 
  • 테스트 실행에 많은 시간이 걸리는 경우

사용되는 경우

  • 데이터베이스 연동 테스트
  • 외부 API 호출 테스트
  • 네트워크 통신 테스트
  • 파일 시스템 접근 테스트

사용하지 말아야하는 경우

  • 순수 함수 : reduce, map 등등 은 입력이 같으면 항상 같은 결과를 반환
  • 간단한 상태 관리 로직 
  • 단순한 의존성 또는 데이터 구조를 사용하는 경우
  • 실제 동작 검증이 필요한 경우
  • 과도한 mocking 으로 인해 테스트 유지보수가 어려운 경우
  • Mock 객체의 설정이 실제 환경과 크게 다를 경우
  • 상태 검증 기반이 더 적합한 경우

종류

  • 스텁(stub) : 특정한 입력에 대해 미리 정해진 결과를 반환하도록 하드 코딩된 객체
  • 페이크 객체 (fake object) : 실제로 동작하는 것처럼 보이지만, 프로덕션 환경에서 사용하기에는 단순화된 구현을 가진 객체
  • 스파이 (spy) : 실제 객체를 부분적으로 목킹하여, 호출된 메서드나 파라미터 등을 기록하고 검증할 수 있는 객체
  • Mock 객체 (mock object) : 실제 객체의 행위를 흉내내어 행위 기반 테스트를 위해 사용. 호출 여부, 호출 횟수, 전달된 파라미터 등을 검증가능

이점

  • 외부 의존성(API, 데이터베이스 등) 없이 테스트 가능
  • 테스트 실행 속도 향상
  • 특정 상황(에러, 타임아웃 등)을 쉽게 시뮬레이션
  • 함수 호출 여부, 인자, 횟수 등을 검증 가능

Mock 객체 사용 여부 판단 기준

  1. 이 코드가 외부 리소스에 의존하는가?
    • API 호출
    • 데이터베이스 접근
    • 파일 시스템 사용 : 파일 읽기/쓰기 가 필요한 경우
  2. 테스트 실행이 느리거나 비용이 드는가?
    • 무거운 연산
    • 네트워크 지연
    • API 호출 비용
  3. 테스트 결과가 비결정적인가?
    • 랜덤 값 사용 : 무작위 값에 따라 결과가 달라지는 경우
    • 시간에 의존적인 로직 : 현재 시간이나 날짜에 따라 동작이 변하는 경우
    • 동시성 이슈 : 멀티스레딩 등으로 인해 겨로가가 일정하지 않은 경우 
  4. 테스트 셋업이 복잡한가?
    • 많은 의존성 필요 : 여러 모듈이나 서비스에 의존하는 경우
    • 복잡한 상태 설정 필요

 

(단순한 예시) 테스트를 위해서 만들어진 user 객체 ?

▶ user 는 테스트를 위해서 임의로 만들어진 단순한 데이터 객체이지 행위는 없다. 그러므로 Mock 객체라고 할 수 없다. 

+ Recent posts