Проверка вызова метода в не-mock объекте через Mockito
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы отследить вызовы методов реальных объектов, используется Mockito.spy
. Создайте «шпиона» для своего объекта, затем вызовите нужный метод и проверьте такой вызов.
YourClass realObject = new YourClass();
YourClass spy = Mockito.spy(realObject);
spy.methodToVerify();
Mockito.verify(spy).methodToVerify(); // Проверка вызова через шпиона
«Шпионаж» — это метод тестирования, в ходе которого создаётся обертка над реальным объектом, которая передаёт вызовы методов непосредственно ему, что позволяет контролировать взаимодействие, сохранив при этом полное поведение самого объекта.

Визуализация
Для лучшего понимания, как проверяются вызовы методов реальных объектов, визуализируем это с помощью таблицы:
| Класс (Сцена) | Вызов метода (Выступление) | Тест (Оценка) |
|--------------|---------------------------|--------------------------|
| Classville | Ожидаемое выступление в 20:00 | Шпион – оценка зрителя |
«Шпионы» (🕵️♂️) играют роль скрытых критиков, они позволяют оценить выступление, не вмешиваясь в его течение.
// RealObject realObject = Mockito.spy(new RealObject());
realObject.methodToBeVerified(); // Начинается представление
Mockito.verify(realObject).methodToBeVerified(); // 🕵️️ Шпион делает выводы!
Таким образом, следя за действиями реальных объектов, мы получаем возможность быть свидетелями их взаимодействия, сохраняя при этом их подлинность.
Шпионы: партнеры реального объекта
Для объявления шпионов в тестах удобно использовать аннотацию @Spy
:
@Spy
YourClass mySpy;
// Внутри тестового метода
Mockito.verify(mySpy).methodToVerify(); // Шпион – «судья», следящий за действием
Аннотация @Spy
автоматически создаёт шпиона, что удобно при внедрении зависимостей, например, в Spring.
Поведенческое тестирование: включаем шпионский режим
Шпионы становятся необходимыми при проверке поведения реальных объектов. Вместо имитации поведения моками, тестируем взаимодействие класса с унаследованным кодом или сторонними библиотеками.
Потенциальные проблемы
Использование шпионов может привести к:
- Нестабильности тестов из-за нестабильного поведения основных компонентов.
- Сложности тестов при чрезмерном использовании шпионов.
- Важно осознанно использовать шпионы, поскольку некоторые операции всё ещё могут требовать реальных объектов.
Лучшие практики шпионажа
- Используйте шпионов для мониторинга ключевых зависимостей, избегайте попыток контролировать все процессы.
- Квалифицированные шпионы должны концентрироваться на интеграционных точках для проверки их функциональности.
- Помните, что для превращения объекта в шпиона достаточно просто внедрить зависимость.
Полезные материалы
- Использование ByteBuddy для генерации кода в реальном времени для тестирования — обучающее пособие по Byte Buddy, инструменте для генерации кода.
- Руководство пользователя JUnit 5 — основной документ по работе с JUnit 5.
- Учебник по Java Reflection API — ваш гид в мире динамических вызовов методов.
- Введение в Java Agents — подробное руководство по работе с Java Agents для манипуляции байт-кодом и инструментирования.