Mockito — это популярная библиотека для создания mock-объектов (заглушек) в unit-тестах. Она позволяет имитировать поведение зависимостей, чтобы изолировать тестируемый код от внешних систем, таких как базы данных, веб-сервисы или другие сложные компоненты. Это особенно полезно, когда вы хотите протестировать только логику вашего класса, не завися от реальных реализаций его зависимостей.
Добавление Mockito в проект
Для начала необходимо добавить зависимость Mockito в ваш проект. Если вы используете Maven, добавьте следующий фрагмент в ваш pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
Для Gradle добавьте следующее в build.gradle
:
testImplementation 'org.mockito:mockito-core:5.3.1'
Создание mock-объекта
Mockito позволяет создавать mock-объекты с помощью метода Mockito.mock()
. Например, если у вас есть интерфейс UserRepository
, вы можете создать его mock-объект следующим образом:
UserRepository userRepositoryMock = Mockito.mock(UserRepository.class);
Определение поведения mock-объекта
Вы можете указать, как mock-объект должен вести себя при вызове его методов. Для этого используется метод Mockito.when()
. Например, если вы хотите, чтобы метод findById()
возвращал определенного пользователя, вы можете сделать так:
User mockUser = new User("1", "John Doe");
Mockito.when(userRepositoryMock.findById("1")).thenReturn(mockUser);
В этом примере, когда метод findById()
вызывается с аргументом "1"
, он возвращает объект mockUser
.
Использование mock-объекта в тестах
Теперь вы можете передать mock-объект в тестируемый класс и проверить его поведение. Например, если у вас есть класс UserService
, который зависит от UserRepository
, вы можете написать тест следующим образом:
@Test
public void testGetUserById() {
UserRepository userRepositoryMock = Mockito.mock(UserRepository.class);
User mockUser = new User("1", "John Doe");
Mockito.when(userRepositoryMock.findById("1")).thenReturn(mockUser);
UserService userService = new UserService(userRepositoryMock);
User result = userService.getUserById("1");
assertEquals("John Doe", result.getName());
}
В этом тесте мы проверяем, что метод getUserById()
класса UserService
возвращает правильного пользователя.
Проверка вызовов методов (Verification)
Mockito также позволяет проверять, были ли вызваны определенные методы mock-объекта. Например, вы можете убедиться, что метод findById()
был вызван ровно один раз:
Mockito.verify(userRepositoryMock, Mockito.times(1)).findById("1");
Если метод был вызван больше или меньше раз, чем указано, тест завершится с ошибкой.
Использование аннотаций
Mockito предоставляет аннотации для упрощения создания mock-объектов. Например, вы можете использовать аннотацию @Mock
для создания mock-объекта и @InjectMocks
для автоматического внедрения зависимостей в тестируемый класс:
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@Mock
private UserRepository userRepositoryMock;
@InjectMocks
private UserService userService;
@Test
public void testGetUserById() {
User mockUser = new User("1", "John Doe");
Mockito.when(userRepositoryMock.findById("1")).thenReturn(mockUser);
User result = userService.getUserById("1");
assertEquals("John Doe", result.getName());
}
}
В этом примере Mockito автоматически создает mock-объект для UserRepository
и внедряет его в UserService
.
Mockito — это мощный инструмент для создания mock-объектов и тестирования изолированных компонентов. С его помощью вы можете:
Использование Mockito позволяет писать чистые и надежные unit-тесты, которые не зависят от внешних систем и легко поддерживаются.