Ответ
Mock-объекты — это ключевой инструмент для модульного (unit) тестирования. Я использую их, чтобы изолировать тестируемый модуль от его внешних зависимостей, таких как база данных, API-сервисы, файловая система или сложные внутренние компоненты.
Пример из моего опыта (Python, pytest с unittest.mock):
Допустим, я тестирую сервис NotificationService, который отправляет email через внешний клиент EmailClient.
# service.py
class NotificationService:
def __init__(self, email_client):
self.email_client = email_client
def send_welcome_email(self, user_email):
subject = "Welcome!"
body = "Thank you for registering."
return self.email_client.send(user_email, subject, body)
# test_service.py
from unittest.mock import Mock
def test_send_welcome_email_success():
# 1. Создаю mock-заглушку для EmailClient
mock_email_client = Mock()
# 2. Настраиваю её возвращать успешный результат
mock_email_client.send.return_value = {"status": "sent", "message_id": "123"}
# 3. Инжектирую mock в тестируемый сервис
service = NotificationService(mock_email_client)
# 4. Выполняю тестируемый метод
result = service.send_welcome_email("test@example.com")
# 5. Проверяю бизнес-логику (результат)
assert result["status"] == "sent"
# 6. Проверяю взаимодействие (вызов с правильными аргументами)
mock_email_client.send.assert_called_once_with(
"test@example.com", "Welcome!", "Thank you for registering."
)
Почему именно на unit-уровне? Потому что цель — проверить логику NotificationService, а не реальную отправку email. На интеграционном или системном уровне я бы уже использовал реальный или тестовый SM-сервер. Mock-объекты позволяют мне тестировать код быстро, стабильно и без побочных эффектов.