Как использовать Mockito для мокирования зависимостей?java-95

Mockito — это популярная библиотека для создания mock-объектов (заглушек) в unit-тестах. Она позволяет имитировать поведение зависимостей, чтобы изолировать тестируемый код от внешних систем, таких как базы данных, веб-сервисы или другие сложные компоненты. Это особенно полезно, когда вы хотите протестировать только логику вашего класса, не завися от реальных реализаций его зависимостей.

Основные шаги для мокирования зависимостей

  1. Добавление 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'
    
  2. Создание mock-объекта
    Mockito позволяет создавать mock-объекты с помощью метода Mockito.mock(). Например, если у вас есть интерфейс UserRepository, вы можете создать его mock-объект следующим образом:

    UserRepository userRepositoryMock = Mockito.mock(UserRepository.class);
    
  3. Определение поведения mock-объекта
    Вы можете указать, как mock-объект должен вести себя при вызове его методов. Для этого используется метод Mockito.when(). Например, если вы хотите, чтобы метод findById() возвращал определенного пользователя, вы можете сделать так:

    User mockUser = new User("1", "John Doe");
    Mockito.when(userRepositoryMock.findById("1")).thenReturn(mockUser);
    

    В этом примере, когда метод findById() вызывается с аргументом "1", он возвращает объект mockUser.

  4. Использование 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 возвращает правильного пользователя.

  5. Проверка вызовов методов (Verification)
    Mockito также позволяет проверять, были ли вызваны определенные методы mock-объекта. Например, вы можете убедиться, что метод findById() был вызван ровно один раз:

    Mockito.verify(userRepositoryMock, Mockito.times(1)).findById("1");
    

    Если метод был вызван больше или меньше раз, чем указано, тест завершится с ошибкой.

  6. Использование аннотаций
    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-объектов и тестирования изолированных компонентов. С его помощью вы можете:

  • Создавать mock-объекты для зависимостей.
  • Определять поведение этих объектов.
  • Проверять, как и сколько раз вызывались методы mock-объектов.
  • Упрощать тестирование с помощью аннотаций.

Использование Mockito позволяет писать чистые и надежные unit-тесты, которые не зависят от внешних систем и легко поддерживаются.