Gymterview
middle

Что такое Mockito и как его использовать?

Mockito – фреймворк для создания mock-объектов в unit-тестах. Позволяет подменить зависимости тестируемого класса и проверить взаимодействие с ними.

Базовая настройка

Для работы с JUnit 5 требуется @ExtendWith(MockitoExtension.class). Аннотация @Mock создаёт mock-объект, @InjectMocks создаёт тестируемый объект и внедряет в него моки через конструктор или сеттеры.

Пример

Полный пример с Mockito
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {

    @Mock
    private OrderRepository orderRepository;

    @Mock
    private PaymentService paymentService;

    @InjectMocks
    private OrderService orderService;

    @Test
    void shouldCreateOrder() {
        // given
        Order order = new Order("product-1", BigDecimal.TEN);
        when(orderRepository.save(any(Order.class))).thenReturn(order);
        when(paymentService.charge(any())).thenReturn(true);

        // when
        Order result = orderService.createOrder("product-1", BigDecimal.TEN);

        // then
        assertThat(result.getProductId()).isEqualTo("product-1");
        verify(orderRepository).save(any(Order.class));
        verify(paymentService).charge(any());
    }

    @Test
    void shouldThrowWhenPaymentFails() {
        when(paymentService.charge(any())).thenReturn(false);

        assertThrows(PaymentException.class,
            () -> orderService.createOrder("product-1", BigDecimal.TEN));

        verify(orderRepository, never()).save(any()); // save НЕ вызван
    }
}

ArgumentCaptor – захват аргументов

Пример
@Test
void shouldSendCorrectEmail() {
    orderService.createOrder("product-1", BigDecimal.TEN);

    ArgumentCaptor<Email> captor = ArgumentCaptor.forClass(Email.class);
    verify(emailService).send(captor.capture());

    Email sentEmail = captor.getValue();
    assertThat(sentEmail.getSubject()).contains("Заказ создан");
    assertThat(sentEmail.getTo()).isEqualTo("customer@mail.com");
}

Основные методы

Метод Назначение
when(...).thenReturn(...) Задать возвращаемое значение
when(...).thenThrow(...) Бросить исключение
doReturn(...).when(spy) Для spy-объектов (без вызова реального метода)
verify(mock).method() Проверить, что метод вызван
verify(mock, times(2)) Проверить количество вызовов
verify(mock, never()) Проверить, что метод НЕ вызван
any(), eq(), argThat() Матчеры аргументов

Ключевые принципы

  • @ExtendWith(MockitoExtension.class) – обязательно для JUnit 5
  • @InjectMocks – создаёт объект и внедряет @Mock-поля через конструктор/сеттеры
  • BDD-стиль: given(...).willReturn(...) + then(mock).should().method()
  • Mockito 5.x – final-классы мокируются по умолчанию

Частые ошибки

  • Mock вместо реального объекта – если класс простой и без зависимостей, mock не нужен
  • when() на spy – используйте doReturn().when(spy), иначе реальный метод выполнится
  • Смешивание matchers: verify(mock).method(eq("a"), any()) – если один аргумент matcher, все должны быть matchers

Как используется в 2026

  • Mockito 5.x – стандарт; mockmaker-inline по умолчанию (final, static mocking)
  • @MockitoBean (Spring Boot 3.4+) – замена @MockBean с лучшей производительностью

На собеседовании: интервьюер часто просит написать тест с Mockito на доске. Важно показать структуру given-when-then, использование @Mock/@InjectMocks и знание разницы между when().thenReturn() и doReturn().when(). Частая ошибка – не знать про matchers и ArgumentCaptor.