Mocking이란 unit test를 할 수 있도록 가짜 데이터를 만드는 것이다. 테스트 시 데이터베이스 또는 외부 API에 의존하는 코드를 테스트해야 하는 경우가 생긴다. 또한 여러 제약에 의해 테스트 시 외부 API를 사용할 수 없는 경우도 생긴다. 그러므로 테스트 시 외부 API를 사용하진 않지만 마치 사용하는 것처럼 테스트 할 수도 있다.
파이썬에는 매직 메서드(magic method)라는 개념이 있는데, 모든 객체에는 언어 레벨에서 특수한 목적으로 쓰이는 메서드들을 정의할 수 있다. 그 중 하나가 str 으로, 객체를 가독성 좋은 문자열로 출력하는 매젝 메서드이다. 기본적으로 Mock 클래스를 사용하면 이러한 매직 메서드가 자동으로 모킹되지 않는다.
그러므로 매직 메서드를 모킹하기 위해서는 새로운 mock 객체를 직접 생성해서 메서드를 할당해줘야 한다.
mock.__str__ = Mock(return_value = "abc")
str(mock)
"abc"
하지만 MagicMock 클래스를 사용하면 이러한 매직 메서드를 알아서 모킹을 해놓는다.
from unittest.mock import MagicMock
mock = MagicMock()
mock.__str__.return_value
"<MagicMock id='1234'>"
mock.__str__.return_value = "abc"
str(mock)
"abc"