Что такое Stub (стаб) в контексте тестирования?

«Что такое Stub (стаб) в контексте тестирования?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Stub (стаб) — это тип тестового дублёра (test double), который заменяет реальный зависимый компонент и предоставляет заранее заданные, жёстко запрограммированные ответы на вызовы во время теста.

Основная цель: Изолировать тестируемый модуль от его зависимостей, контролируя их поведение и упрощая проверку логики основного модуля.

Отличие от Mock: Stub Mock
Задаёт состояние (возвращает данные). Проверяет поведение (ожидает определённые вызовы).
Отвечает на запросы предопределёнными значениями. Верифицирует, как и сколько раз были вызваны его методы.

Пример Stub на Java:

// Интерфейс зависимости
public interface PaymentGateway {
    boolean processPayment(double amount);
}

// Stub-реализация для теста успешной оплаты
public class SuccessfulPaymentStub implements PaymentGateway {
    @Override
    public boolean processPayment(double amount) {
        // Всегда возвращает успех, игнорируя логику и аргументы
        return true;
    }
}

// Stub-реализация для теста неудачной оплаты
public class FailingPaymentStub implements PaymentGateway {
    @Override
    public boolean processPayment(double amount) {
        return false; // Всегда возвращает неудачу
    }
}

// Использование в тесте
@Test
void testOrderProcessing_Success() {
    PaymentGateway stub = new SuccessfulPaymentStub();
    OrderService service = new OrderService(stub);

    Order order = service.processOrder(new Order(100.0));

    assertThat(order.getStatus()).isEqualTo(OrderStatus.CONFIRMED);
}

Стабы полезны для тестирования сценариев, зависящих от внешних сервисов, баз данных или сложных вычислений.