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(): если хотя бы один аргумент использует матчер, все остальные тоже должны использовать матчеры.