Назад к вопросам
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 проверяет взаимодействие