Проверка вызовов методов с помощью verify в Mockito
Mockito позволяет убедиться, что методы ваших mock-объектов вызывались определённое количество раз, в правильной последовательности или с определёнными параметрами. Это называется проверка взаимодействий.
Как работает verify?
Если метод не был вызван, тест упадёт с ошибкой.
Расширенные проверки
Количество вызовов:
Последовательность вызовов:
Проверка отсутствия взаимодействий:
Пример: Тестирование сервиса с использованием Mockito
Рассмотрим сервис, который взаимодействует с репозиторием:
Тест для этого сервиса:
Что мы сделали в тесте?
Создали mock для UserRepository с помощью @Mock.
Связали mock с тестируемым сервисом через @InjectMocks.
Задали поведение mock-объекта с помощью when и проверили результат.
Убедились, что репозиторий вызван с нужными параметрами через verify.
#Java #Training #Spring #Testing #Mockito #Verify
Mockito позволяет убедиться, что методы ваших mock-объектов вызывались определённое количество раз, в правильной последовательности или с определёнными параметрами. Это называется проверка взаимодействий.
Как работает verify?
List<String> mockList = Mockito.mock(List.class);
// Взаимодействие
mockList.add("Mockito");
mockList.clear();
// Проверка взаимодействий
Mockito.verify(mockList).add("Mockito"); // Проверяет вызов add с параметром "Mockito"
Mockito.verify(mockList).clear(); // Проверяет вызов clear
Если метод не был вызван, тест упадёт с ошибкой.
Расширенные проверки
Количество вызовов:
Mockito.verify(mockList, Mockito.times(1)).add("Mockito");
Mockito.verify(mockList, Mockito.never()).add("Spring");
Последовательность вызовов:
InOrder inOrder = Mockito.inOrder(mockList);
inOrder.verify(mockList).add("Mockito");
inOrder.verify(mockList).clear();
Проверка отсутствия взаимодействий:
Mockito.verifyNoInteractions(mockList);
Пример: Тестирование сервиса с использованием Mockito
Рассмотрим сервис, который взаимодействует с репозиторием:
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserName(Long id) {
return userRepository.findById(id).orElse("Unknown");
}
}
Тест для этого сервиса:
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void getUserName_ReturnsCorrectName() {
// Stub репозитория
Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of("John Doe"));
// Вызов метода
String result = userService.getUserName(1L);
// Проверки
Assertions.assertEquals("John Doe", result);
Mockito.verify(userRepository).findById(1L);
}
@Test
void getUserName_ReturnsUnknownForMissingUser() {
// Stub для случая, когда пользователь отсутствует
Mockito.when(userRepository.findById(2L)).thenReturn(Optional.empty());
// Вызов метода
String result = userService.getUserName(2L);
// Проверки
Assertions.assertEquals("Unknown", result);
Mockito.verify(userRepository).findById(2L);
}
}
Что мы сделали в тесте?
Создали mock для UserRepository с помощью @Mock.
Связали mock с тестируемым сервисом через @InjectMocks.
Задали поведение mock-объекта с помощью when и проверили результат.
Убедились, что репозиторий вызван с нужными параметрами через verify.
#Java #Training #Spring #Testing #Mockito #Verify