Назад к вопросам
Middle
113
questionbank

В чём отличие между stub и mock?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Stub — это простой объект-заглушка, который возвращает заранее определенные значения в ответ на вызовы методов, не содержащий сложной логики. Используется для изолирования тестируемого кода от его зависимостей и предоставления контролируемых ответов.

Mock — это объект-заглушка с ожиданиями относительно того, как и сколько раз будут вызваны его методы. Используется для проверки взаимодействия между объектами, а не только возвращаемых значений. Mock-объект выбросит исключение, если вызовы методов не соответствуют установленным ожиданиям.

Основные отличия:

  • Цель: Stub фокусируется на предоставлении данных для теста, mock - на проверке поведения и взаимодействия.
  • Проверка: Stub не проверяет, как его методы вызываются. Mock активно проверяет вызовы методов.
  • Фиксация: Stub обычно не требует фиксации ожиданий. Mock требует фиксации ожиданий до выполнения теста.
// Пример использования Stub (без конкретной библиотеки)
// Представим, что у нас есть сервис зависимости
interface DependentService {
    String getData();
}

// Stub-реализация
class DependentServiceStub implements DependentService {
    @Override
    public String getData() {
        return "stub data"; // Возвращаем жестко заданное значение
    }
}

// Тестируемый класс, использующий зависимость
class MyService {
    private DependentService dependentService;

    public MyService(DependentService dependentService) {
        this.dependentService = dependentService;
    }

    public String processData() {
        return "Processed: " + dependentService.getData();
    }
}

// В тесте мы создадим MyService с DependentServiceStub
// и проверим, что processData возвращает ожидаемый результат
// String result = new MyService(new DependentServiceStub()).processData();
// Assertions.assertEquals("Processed: stub data", result); // Stub просто предоставляет данные
// Пример использования Mock (с использованием Mockito)
// Предположим, мы тестируем другой класс, который взаимодействует с DependentService
class AnotherService {
    private DependentService dependentService;

    public AnotherService(DependentService dependentService) {
        this.dependentService = dependentService;
    }

    public void doSomething() {
        dependentService.getData();
        // Возможно, здесь еще какие-то вызовы методов dependentService
    }
}

// В тесте мы будем использовать mock-объект.
// Будем проверять, был ли вызван метод getData() у mock-объекта
// DependentService mockDependentService = Mockito.mock(DependentService.class);
// AnotherService anotherService = new AnotherService(mockDependentService);

// Выполняем тестируемый метод
// anotherService.doSomething();

// Проверяем, что метод getData() был вызван один раз
// Mockito.verify(mockDependentService, Mockito.times(1)).getData(); // Mock проверяет взаимодействие