Проверка вызова метода в не-mock объекте через Mockito

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы отследить вызовы методов реальных объектов, используется Mockito.spy. Создайте «шпиона» для своего объекта, затем вызовите нужный метод и проверьте такой вызов.

Java
Скопировать код
YourClass realObject = new YourClass();
YourClass spy = Mockito.spy(realObject);

spy.methodToVerify();

Mockito.verify(spy).methodToVerify(); // Проверка вызова через шпиона

«Шпионаж» — это метод тестирования, в ходе которого создаётся обертка над реальным объектом, которая передаёт вызовы методов непосредственно ему, что позволяет контролировать взаимодействие, сохранив при этом полное поведение самого объекта.

Кинга Идем в IT: пошаговый план для смены профессии

Визуализация

Для лучшего понимания, как проверяются вызовы методов реальных объектов, визуализируем это с помощью таблицы:

Markdown
Скопировать код
| Класс (Сцена)  | Вызов метода (Выступление) | Тест (Оценка)               |
|--------------|---------------------------|--------------------------|
| Classville   | Ожидаемое выступление в 20:00 | Шпион – оценка зрителя |

«Шпионы» (🕵️‍♂️) играют роль скрытых критиков, они позволяют оценить выступление, не вмешиваясь в его течение.

Java
Скопировать код
// RealObject realObject = Mockito.spy(new RealObject());
realObject.methodToBeVerified();     // Начинается представление 

Mockito.verify(realObject).methodToBeVerified(); // 🕵️️ Шпион делает выводы!

Таким образом, следя за действиями реальных объектов, мы получаем возможность быть свидетелями их взаимодействия, сохраняя при этом их подлинность.

Шпионы: партнеры реального объекта

Для объявления шпионов в тестах удобно использовать аннотацию @Spy:

Java
Скопировать код
@Spy
YourClass mySpy;

// Внутри тестового метода
Mockito.verify(mySpy).methodToVerify(); // Шпион – «судья», следящий за действием

Аннотация @Spy автоматически создаёт шпиона, что удобно при внедрении зависимостей, например, в Spring.

Поведенческое тестирование: включаем шпионский режим

Шпионы становятся необходимыми при проверке поведения реальных объектов. Вместо имитации поведения моками, тестируем взаимодействие класса с унаследованным кодом или сторонними библиотеками.

Потенциальные проблемы

Использование шпионов может привести к:

  • Нестабильности тестов из-за нестабильного поведения основных компонентов.
  • Сложности тестов при чрезмерном использовании шпионов.
  • Важно осознанно использовать шпионы, поскольку некоторые операции всё ещё могут требовать реальных объектов.

Лучшие практики шпионажа

  • Используйте шпионов для мониторинга ключевых зависимостей, избегайте попыток контролировать все процессы.
  • Квалифицированные шпионы должны концентрироваться на интеграционных точках для проверки их функциональности.
  • Помните, что для превращения объекта в шпиона достаточно просто внедрить зависимость.

Полезные материалы

  1. Использование ByteBuddy для генерации кода в реальном времени для тестирования — обучающее пособие по Byte Buddy, инструменте для генерации кода.
  2. Руководство пользователя JUnit 5 — основной документ по работе с JUnit 5.
  3. Учебник по Java Reflection API — ваш гид в мире динамических вызовов методов.
  4. Введение в Java Agents — подробное руководство по работе с Java Agents для манипуляции байт-кодом и инструментирования.