Gymterview
middle

Какие существуют виды тестовых объектов?

Тестовые объекты (test doubles) – подменные объекты, которые заменяют реальные зависимости в тестах. Классификация по Gerard Meszaros: Dummy, Fake, Stub, Spy, Mock.

Тип Назначение Реальная логика Проверка вызовов
Dummy Заглушка для компиляции Нет Нет
Fake Упрощённая рабочая реализация Да (упрощённая) Нет
Stub Возвращает заданные ответы Нет Нет
Spy Оборачивает реальный объект Да Да
Mock Программируемое поведение + проверка Нет Да

Dummy

Объект-заглушка, передаётся как параметр, но не используется:

Пример
// null или пустой объект -- нужен только для компиляции
var service = new OrderService(new DummyLogger());

Fake

Упрощённая, но рабочая реализация (например, in-memory хранилище вместо реальной БД):

Пример Fake-репозитория
class FakeUserRepository implements UserRepository {
    private final Map<Long, User> store = new HashMap<>();

    @Override
    public User save(User user) {
        store.put(user.getId(), user);
        return user;
    }

    @Override
    public Optional<User> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }
}

Stub

Возвращает заранее заданные ответы:

Пример
when(userRepository.findById(1L)).thenReturn(Optional.of(testUser));

Spy

Оборачивает реальный объект, записывая вызовы:

Пример
List<String> spyList = spy(new ArrayList<>());
spyList.add("item");
verify(spyList).add("item"); // проверяем, что add был вызван
assertEquals(1, spyList.size()); // реальная логика работает

Mock

Объект с запрограммированным поведением и проверкой вызовов:

Пример
UserRepository mock = mock(UserRepository.class);
when(mock.findById(1L)).thenReturn(Optional.of(testUser));
// ... использование
verify(mock, times(1)).findById(1L); // проверка вызова

Ключевые принципы

  • Stub – подменяет данные (state verification); Mock – проверяет взаимодействие (behavior verification)
  • В Mockito: mock() создаёт mock, spy() оборачивает реальный объект
  • Предпочитайте state verification (stub + assert result) над behavior verification (mock + verify)

Частые ошибки

  • Mock всего – если можно протестировать с реальным объектом, mock не нужен
  • Verify без необходимости – verify нужен только когда возвращаемое значение не говорит о корректности
  • Spy с final-классами – Mockito не может spy final-классы без mockito-inline

Как используется в 2026

  • Mockito 5.x – поддержка final-классов по умолчанию (mockmaker-inline)
  • Тренд: меньше моков, больше интеграционных тестов с Testcontainers

На собеседовании: интервьюер проверяет, знаете ли вы разницу между всеми пятью видами, а не только между stub и mock. Частая ошибка – путать Fake и Stub или не знать, что такое Dummy.