Какие основные возможности предоставляет фреймворк Mockito?

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

Ответ

Mockito — это фреймворк для создания мок-объектов (mock objects) в unit-тестах, позволяющий изолировать тестируемый класс от его зависимостей.

Ключевые возможности:

  1. Создание моков:

    List<String> mockedList = mock(List.class);
    // Или с аннотацией @Mock и вызовом MockitoAnnotations.openMocks(this)
  2. Задание поведения (stubbing): Определение, что должен возвращать метод мока.

    when(mockedList.get(0)).thenReturn("first");
    when(mockedList.get(anyInt())).thenReturn("element"); // С матчером
    when(mockedList.clear()).thenThrow(new RuntimeException()); // Исключение
  3. Верификация вызовов: Проверка, что методы мока были вызваны с ожидаемыми параметрами.

    verify(mockedList).get(0);
    verify(mockedList, times(2)).add(anyString()); // Проверка количества вызовов
  4. Захват аргументов: Позволяет проверить аргументы, переданные в метод мока.

    ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
    verify(mockedList).add(captor.capture());
    assertEquals("test", captor.getValue());
  5. Spy: Создание частичного мока на основе реального объекта. Вызовы по умолчанию делегируются реальному объекту, но можно переопределить поведение.

    List<String> realList = new ArrayList<>();
    List<String> spiedList = spy(realList);
    doReturn("fake").when(spiedList).get(10); // Заглушка для spy

Почему Mockito популярен: Он предоставляет чистый, читаемый API для создания тестов с моками, что является ключевым для модульного тестирования и соблюдения принципа единой ответственности в тестах.