Как работает Mockito для тестирования в Java?

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

Ответ

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

Основные концепции и API:

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

    List<String> mockedList = Mockito.mock(List.class);

    Или с использованием аннотаций (требует MockitoAnnotations.openMocks(this) или @ExtendWith(MockitoExtension.class) в JUnit 5):

    @Mock
    List<String> mockedList;
  2. Задание поведения (stubbing):

    when(mockedList.get(0)).thenReturn("first");
    when(mockedList.get(anyInt())).thenThrow(new RuntimeException());
  3. Проверка вызовов (verification):

    verify(mockedList).get(0); // Проверяет, что метод был вызван 1 раз
    verify(mockedList, times(2)).add(anyString()); // Проверяет точное количество вызовов
    verify(mockedList, never()).clear(); // Проверяет, что метод не вызывался
  4. Аргументные матчеры: any(), eq(), contains() и др. для гибкой проверки аргументов.

Пример полного теста:

@ExtendWith(MockitoExtension.class)
class ServiceTest {
    @Mock
    private DependencyRepository repository;
    @InjectMocks
    private ServiceUnderTest service;

    @Test
    void testServiceCall() {
        // Задаем поведение мока
        when(repository.findById(1L)).thenReturn(new Entity("test"));

        // Вызываем тестируемый метод
        String result = service.process(1L);

        // Проверяем результат и взаимодействие
        assertEquals("processed: test", result);
        verify(repository).findById(1L);
    }
}

Spy vs Mock: @Spy создает частичный мок на реальном объекте, позволяя вызывать реальные методы, если их поведение не переопределено.