Ответ
Основной выбор — Mockito. Это де-факто стандарт для модульного тестирования в Java-экосистеме благодаря простому API, хорошей интеграции и активному сообществу.
Преимущества Mockito:
- Простой синтаксис: Читаемый fluent API (
when(...).thenReturn(...),verify(...)). - Поддержка аннотаций:
@Mock,@Spy,@InjectMocks. - Интеграция: Работает с JUnit 4/5 и TestNG.
- Гибкость: Поддержка spy-объектов, аргумент-матчеров, проверки порядка вызовов.
Базовый пример:
// Создание mock-объекта
List<String> mockList = mock(List.class);
// Stubbing (задание поведения)
when(mockList.get(anyInt())).thenReturn("element");
when(mockList.size()).thenReturn(10).thenReturn(20); // разные возвраты при последовательных вызовах
// Использование и верификация
String result = mockList.get(5); // вернет "element"
verify(mockList, times(1)).get(5); // проверка, что метод вызван 1 раз
| Альтернативы и их ниши: | Библиотека | Назначение |
|---|---|---|
| EasyMock | Устаревший аналог Mockito, сейчас редко используется. | |
| PowerMock | Расширение Mockito для мокирования статических методов, конструкторов, final-классов. Используется для работы с legacy-кодом. | |
| JMockit | Мощный фреймворк, может мокать всё, но имеет сложный и менее интуитивный API. |
Рекомендация: Начинайте с Mockito. Подключайте PowerMock только при необходимости мокать статику или конструкторы, так как его использование часто сигнализирует о проблемах в дизайне тестируемого кода.