@RunWith (SpringRunner.class) vs @RunWith (MockitoJUnitRunner.class)

Я использовал @RunWith(MockitoJUnitRunner.class) для моего теста junit с mockito. Но теперь я работаю с весенним загрузочным приложением и пытаюсь использовать @RunWith(SpringRunner.class). Имеет ли использование @RunWith(SpringRunner.class) какие-либо преимущества перед использованием @RunWith(MockitoJUnitRunner.class)? Могу ли я использовать функцию типа @Injectmock, @Mock, @Spy с помощью @RunWith(SpringRunner.class)

Ответы

Ответ 1

SpringRunner обеспечивает поддержку загрузки Spring ApplicationContext и имеющий бобы @Autowired в тестовом экземпляре. На самом деле это намного больше, чем это (описано в справочном руководстве Spring), но это основная идея.

В то время как MockitoJUnitRunner обеспечивает поддержку для создания mocks и шпионов с Mockito.

Однако с JUnit 4 вы можете использовать только один Runner за раз.

Таким образом, если вы хотите использовать поддержку Spring и Mockito одновременно, вы можете выбрать только одного из этих бегунов.

Но вам повезло, так как Spring и Mockito предоставляют правила в дополнение к бегунам.

Например, вы можете использовать Spring-бегун с правилом Mockito следующим образом.

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();

    @Mock
    MyService myService;

    // ...
}

Хотя, как правило, если вы используете Spring Boot и вам нужно @MockBean компонент из Spring ApplicationContext вы можете использовать поддержку Spring Boot @MockBean вместо просто @Mock.

Ответ 2

Когда используется SpringRunner.class, Spring предоставляет соответствующие аннотации:

  • @MockBean
  • @SpyBean

Мокость вводится в тестируемые объекты с помощью аннотации @Autowired. Чтобы включить эту функциональность, тесты должны быть помечены

  • @SpringBootTest

или

  • @TestExecutionListeners(MockitoTestExecutionListener.class)

Более подробную информацию и примеры можно найти в официальной документации: Mocking и Spying Beans

Ответ 3

Согласно JavaDoc:

SpringRunner - это псевдоним для SpringJUnit4ClassRunner. Чтобы использовать этот класс, просто аннотируйте тестовый класс на основе JUnit 4 с помощью @RunWith(SpringRunner.class). Если вы хотите использовать Spring TestContext Framework с другим бегуном, используйте org.springframework.test.context.junit4.rules.SpringClassRule и org.springframework.test.context.junit4.rules.SpringMethodRule.

И JavaDoc TestContext:

TestContext инкапсулирует контекст, в котором выполняется тест, независимо от используемой платформы тестирования.

Это метода getApplicationContext():

Получить контекст приложения для этого тестового контекста, возможно, кэшированный. Реализации этого метода несут ответственность за загрузку контекста приложения, если соответствующий контекст еще не был загружен, что также может кэшировать контекст.

Итак, SpringRunner загружает контекст и отвечает за его поддержку. Например, если вы хотите сохранить данные во встроенной базе данных, такой как база данных H2 в памяти, вы должны использовать SpringRunner.class; и для очистки таблиц, чтобы избавиться от записей, вставленных после каждого теста, вы аннотируете тест с помощью @DirtiesContext, чтобы сообщить Spring о его очистке.

Но это уже интеграционный или компонентный тест. Если ваш тест является чистым модульным тестом, вам не нужно загружать БД или вы просто хотите убедиться, что вызывается какой-то метод зависимости, достаточно MockitoJUnit4Runner. Вы просто используете @Mock как хотите и Mockito.verify(...), и тест пройден. И это намного быстрее.

Тест должен быть быстрым. Как можно быстрее. Поэтому, когда это возможно, используйте MockitoJUnit4Runner, чтобы ускорить его.