На каком уровне тестирования используются Mock-объекты?

«На каком уровне тестирования используются Mock-объекты?» — вопрос из категории Основы тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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-объекты позволяют мне тестировать код быстро, стабильно и без побочных эффектов.