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.