테스트할 코드가 「외부 API 호출, DB 쿼리, 시간 같은 비결정적·외부 의존성」에 의존한다면 그대로 테스트하기 어렵습니다.
mock으로 「가짜 객체」를 만들어 원하는 응답을 시뮬레이션합니다.
Mock 객체.
from unittest.mock import Mock.
m = Mock().
m.method(1, 2) — 호출만 됨, 어떤 인자라도 받음.
m.method.return_value = 42 — 반환값 지정.
m.method.assert_called_with(1, 2) — 호출 인자 검증.
patch — 임시 교체.
@patch("mymodule.requests.get") def test_api(mock_get): mock_get.return_value.json.return_value = {"data": 123}; result = my_function(); assert result == 123.
mymodule의 requests.get을 테스트 동안만 가짜로 교체.
with 문 패턴.
with patch("mymodule.func") as mock: mock.return_value = ...; ...
— 블록 안에서만 교체.
더 작은 범위로 명확하게 적용.
side_effect로 다양한 동작.
mock.side_effect = [1, 2, 3] — 호출마다 다른 반환.
mock.side_effect = ValueError("...") — 예외 발생.
mock.side_effect = my_func — 호출 시 함수 실행.
시뮬레이션 시나리오 자유.
한 줄 요약
mock은 외부 의존성(API·DB·시간)을 가짜 객체로 교체합니다.
Mock·patch·side_effect로 원하는 응답·예외·동작을 시뮬레이션.
단위 테스트의 필수 도구.
더 알아볼 것
- pytest-mock — pytest용 래퍼
- autospec — 시그니처까지 일치
- spy 패턴 — 진짜 호출 + 기록