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.