Какую библиотеку для мокирования вы используете в Java?

«Какую библиотеку для мокирования вы используете в Java?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основной выбор — 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 только при необходимости мокать статику или конструкторы, так как его использование часто сигнализирует о проблемах в дизайне тестируемого кода.