Mockito
3 года назад
Nikolai Gagarinov
Ответы
Mockito — это фреймворк для модульного тестирования, который создаёт фиктивные объекты и позволяет изолировать классы от их реальных зависимостей. Библиотека формирует моки и шпионы, контролирует их поведение и фиксирует вызываемые методы. Инструмент используют для проверки логики кода в сценариях, где работа настоящих зависимостей нежелательна или затруднена.
Mockito подменяет интерфейсы, классы и статические вызовы. Фиктивные объекты принимают команды теста, возвращают заранее определённые значения, фиксируют параметры вызовов и позволяют проверять, взаимодействовал ли тестируемый код с зависимостью так, как ожидалось. Такой подход упрощает локальную проверку логики и снижает количество требуемой инфраструктуры.

Назначение Mockito
Mockito используют для тестирования классов, которые зависят от внешних сервисов, баз данных, сетевых клиентов, файловых хранилищ или сложных систем. Реальные объекты заменяются имитаторами, чтобы:
-
задать результат вызова метода без выполнения настоящей логики;
-
контролировать сценарии, которые сложно или невозможно воспроизвести в реальной среде;
-
фиксировать обращения к методам и проверять их количество и параметры;
-
упрощать структуру тестов и сокращать их время выполнения.
Моки и шпионы относятся к тестовым двойникам. Эти объекты подменяют поведение зависимостей, обеспечивая контролируемую среду выполнения. Mockito предоставляет API для создания таких двойников, настройки их поведения и проверки взаимодействий.
Принцип работы Mockito
Mockito создаёт фиктивные реализации и перехватывает обращение к методам. Для моков библиотека генерирует пустую версию объекта, на которую можно навесить поведение. Для шпионов используется реальный экземпляр — шпион сохраняет делегирование настоящей логике, но фиксирует вызовы.
Механизм работы основан на:
-
генерации подставных объектов во время выполнения;
-
перенаправлении вызовов методов к внутренней прослойке Mockito;
-
хранении сценариев поведения, заданных через API;
-
проверке фактов взаимодействия после выполнения тестируемого кода.
Подключение Mockito
Библиотека подключается к проекту через Gradle или Maven. Пример конфигурации Gradle:
Подключение через Maven:
Для интеграции с JUnit 5 используется расширение MockitoExtension:
Юнит-тестирование и тестовые двойники
Юнит-тест проверяет отдельный метод или класс в изоляции. Реальные зависимости обычно не используются, потому что:
-
их поведение сложно контролировать;
-
выполнение может быть дорогостоящим или нестабильным;
-
требуется моделировать разные ответы зависимостей.
Классические типы двойников:
-
заглушки — жёстко заданное поведение;
-
моки — объекты, чьё поведение настраивает тест;
-
шпионы — обёртки над реальными объектами, фиксирующие вызовы.
Mockito чаще всего применяет моки и шпионы. Моки создаются автоматически, шпионы требуют базовый экземпляр реального класса.
Моки
Мок перехватывает вызовы методов и возвращает указанные тестом значения. Он не выполняет реальной логики. Мок фиксирует, какие методы были вызваны, сколько раз, с какими параметрами.
Принципы использования:
-
создать экземпляр мока;
-
задать ожидаемое поведение методом
when().thenReturn()илиwhen().thenThrow(); -
передать мок в тестируемый класс;
-
выполнить тестируемый код;
-
проверить состояние или взаимодействие.
Шпионы
Шпион оборачивает реальный объект. Вызовы передаются настоящим методам, но доступны для наблюдения. Шпион подходит для частичной подмены поведения или проверки факта вызова без полного переписывания логики.
Пример использования оправдан, если требуется контролировать отдельные методы, но при этом сохранить работу остального функционала.
Создание моков
Mockito предоставляет несколько способов создания фиктивных объектов:
-
через аннотацию @Mock в сочетании с @ExtendWith(MockitoExtension.class);
-
через статический метод
mock(); -
через аннотацию @Spy для создания шпионов;
-
через расширение MockitoAnnotations.
Пример модели данных:
Пример теста:
Тест выполняет действия:
-
создаёт мок зависимого класса;
-
задаёт возврат значения при вызове метода isAvailable;
-
передаёт мок в тестируемый объект;
-
вызывает метод;
-
проверяет результат выполнения.
Значения по умолчанию
Если для вызова метода мока не задано поведение, Mockito возвращает:
-
nullдля объектов; -
0для чисел; -
falseдля булевых значений; -
пустые коллекции.
Такая политика исключает побочные эффекты во время выполнения тестов.
Настройка поведения
Цепочка when(...).thenReturn(...) настраивает возврат значения. В зависимости от аргументов можно задавать разные сценарии. Mockito поддерживает сопоставители:
-
anyString(); -
anyInt(); -
any().
Для генерации исключений применяется thenThrow().
Финальные классы и статические методы
Современная версия Mockito поддерживает создание моков финальных и статических методов через модуль mockito-inline.
Финальный класс:
Создание мока:
Статическое мокирование подходит для случаев, когда изменение архитектуры невозможно, а тест требует контроля поведения статического вызова.
Особенности использования Mockito
Библиотека предоставляет инструменты для захвата аргументов, сопоставления условий вызова, проверки количества обращений, фиксации параметров и формирования частичных подмен поведения. Корректное применение Mockito предполагает контроль структуры кода: если тест требует множества сложных подмен, это сигнал к рефакторингу тестируемого класса и снижению его ответственности.
7 дней назад
Nikolai Gagarinov
Mockito - это библиотека для создания и управления mock-объектами в тестовых классах, написанных на языке программирования Java. Mock-объекты представляют собой искусственные объекты, которые используются для имитации поведения других объектов в процессе тестирования. Библиотека Mockito упрощает создание и использование mock-объектов, позволяя разработчикам сосредоточиться на тестировании логики своего кода.
2 года назад
Елена Редькина





