MockitoJUnitRunner vs initMocks в jUnit4: преимущества и разница

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

При использовании библиотеки Mockito для тестирования, аннотация @RunWith(MockitoJUnitRunner.class) автоматически инициализирует поля, отмеченные аннотацией @Mock:

Java
Скопировать код
@RunWith(MockitoJUnitRunner.class)
public class ExampleTest {
    @Mock
    private SomeClass mock; // Внутренности мока инициализируются автоматически.
    // Методы для тестирования
}

Если же требуется контролировать процесс инициализации самостоятельно, используйте MockitoAnnotations.initMocks(this) в @Before. Этот подход подойдет для случаев, когда необходимы дополнительные настройки:

Java
Скопировать код
public class ExampleTest {
    @Mock
    private SomeClass mock; // Объект, ожидающий инициализации.

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this); // Инициализация объекта.
    }
    // Методы для тестирования
}

Выбирайте @RunWith для упрощения процесса инициализации, но если вам необходим полный контроль, то более предпочтительным будет initMocks.

Погружение в детали

Выбор между @RunWith(MockitoJUnitRunner.class) и MockitoAnnotations.initMocks(this) зависит от специфики проекта, стилистических предпочтений и требований к процессу тестирования.

Кинга Идем в IT: пошаговый план для смены профессии

@RunWith(MockitoJUnitRunner.class)

Преимущества

  • Автоматическая инициализация моков;
  • Валидация корректного использования Mockito после каждого теста;
  • Детальный отчет о возникших проблемах, связанных с использованием Mockito.

Ограничения

  • Невозможность использования совместно с другими JUnit-раннерами, например, с SpringJUnit4ClassRunner.

MockitoAnnotations.initMocks(this)

Преимущества

  • Возможность настройки моков перед их инициализацией;
  • Совместимость с различными JUnit-раннерами.

Недостатки

  • Возможно позднее обнаружение проблем при использовании Mockito;
  • Необходимость написания дополнительного кода, что усложняет структуру тестов.

Использование MockitoRule

С появлением версии Mockito 2.1.0 стала доступна альтернатива в виде MockitoRule. Её преимуществом является сочетание возможностей @RunWith(MockitoJUnitRunner.class), но без ограничения в использовании одного JUnit-раннера:

Java
Скопировать код
public class ExampleTest {
    @Mock
    private SomeClass mock;
    
    @Rule
    public MockitoRule rule = MockitoJUnit.rule(); // Инициализация без ограничений.

    // Методы для тестирования
}

Таким образом, обеспечивается удобство автоматической инициализации и гибкость при работе с различными раннерами.

Визуализация

@RunWith(MockitoJUnitRunner.class) и MockitoAnnotations.initMocks(this) можно сравнить с действиями двух механиков:

Markdown
Скопировать код
`@RunWith(MockitoJUnitRunner.class)`:
Автомобиль + Ящик инструментов + Механик -> [Светофор] -> Автомобиль, готовый к гонке 🏎️💨
// Механик автоматически приготовил автомобиль к старту.

`MockitoAnnotations.initMocks(this)`:
Автомобиль на финише -> [Водитель вызывает механика] -> Автомобиль, готовый к гонке 🏎️💨
// Водитель сам вызвал механика для подготовки автомобиля к следующему этапу соревнований.

В сущности:

Markdown
Скопировать код
**@RunWith**: Механик уже установлен у светофора и готовит автомобиль. 🚦
**initMocks**: Механика придётся вызвать на финише. 🏁

Выбор остается за вами!

Практическое использование и сценарии

В различных ситуациях могут пригодиться как @RunWith(MockitoJUnitRunner.class), так и MockitoAnnotations.initMocks(this):

Когда выбирать @RunWith(MockitoJUnitRunner.class)

  • Для сокращения вручную выполняемой подготовки и повышения читаемости тестов;
  • Когда важна своевременная обратная связь по ошибкам;
  • Если нет необходимости в совмещении с другими JUnit-раннерами.

Когда выбирать MockitoAnnotations.initMocks(this)

  • При необходимости интеграции с другими JUnit-раннерами или потребности в гибкости настроек;
  • Если вы хотите контролировать момент инициализации моков.

Полезные материалы

  1. MockitoJUnitRunner – mockito-core 5.10.0 javadoc — официальная документация MockitoJUnitRunner.
  2. MockitoAnnotations – mockito-core 5.10.0 javadoc — детальное руководство и описание использования MockitoAnnotations.initMocks.
  3. java – @RunWith(MockitoJUnitRunner.class) vs MockitoAnnotations.initMocks(this) – Stack Overflow — обсуждение применения @RunWith и initMocks в сообществе разработчиков.
  4. JUnit 5 User Guide — развернутое руководство по JUnit 5.
  5. GitHub – mockito/mockito: Популярная библиотека для создания моков в Java-тестах — официальный репозиторий Mockito.