Gymterview
junior

Каковы основы работы с Mockito?

Mockito — библиотека для создания мок-объектов в Java-тестах. Она позволяет подменять зависимости и задавать их поведение.

Создание мока

Пример
// Программно
UserRepository userRepository = Mockito.mock(UserRepository.class);

// С помощью аннотации (требуется @ExtendWith(MockitoExtension.class))
@Mock
private UserRepository userRepository;

when/thenReturn — задание возвращаемого значения

Пример
@Test
void shouldReturnUser() {
    User user = new User(1L, "Иван");
    when(userRepository.findById(1L)).thenReturn(Optional.of(user));

    Optional<User> result = userRepository.findById(1L);

    assertTrue(result.isPresent());
    assertEquals("Иван", result.get().getName());
}

when/thenThrow — задание выбрасываемого исключения

Пример
when(userRepository.findById(999L))
    .thenThrow(new EntityNotFoundException("Пользователь не найден"));

verify — проверка вызова метода

Пример
@Test
void shouldSaveUser() {
    User user = new User("Иван");
    userService.create(user);

    verify(userRepository, times(1)).save(user);
    verify(userRepository, never()).delete(any());
    verify(userRepository, atLeastOnce()).findAll();
}

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

Пример
@Test
void shouldCaptureArgument() {
    userService.create(new UserDto("Иван", "ivan@example.com"));

    ArgumentCaptor<User> captor = ArgumentCaptor.forClass(User.class);
    verify(userRepository).save(captor.capture());

    User savedUser = captor.getValue();
    assertEquals("Иван", savedUser.getName());
    assertEquals("ivan@example.com", savedUser.getEmail());
}

ArgumentMatchers — гибкое сопоставление аргументов

Пример
when(userRepository.findByName(anyString())).thenReturn(List.of(user));
when(userRepository.findById(eq(1L))).thenReturn(Optional.of(user));
when(userRepository.findByAgeGreaterThan(argThat(age -> age > 0)))
    .thenReturn(List.of(user));

На собеседовании: минимальный набор, который нужно знать — when/thenReturn, verify, @Mock, @InjectMocks. Частая ошибка — путать any() и eq(): если хотя бы один аргумент использует матчер, все остальные тоже должны использовать матчеры.