@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 предоставляет соответствующие аннотации:
Мокость вводится в тестируемые объекты с помощью аннотации @Autowired
. Чтобы включить эту функциональность, тесты должны быть помечены
или
@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
, чтобы ускорить его.
Ответ 4
вы можете использовать SpringRunner как для модульных, так и для интеграционных тестов.
Учебное пособие по SpringRunner