Когда использовать @RunWith и когда @ExtendWith

#spring-boot #annotations #junit4 #junit5

#весенняя загрузка #примечания #junit4 #junit5

Вопрос:

Мы с моей командой работали над множеством микросервисов, используя Spring boot. Поскольку сервисы прошли через обновления JUnit и Spring Boot (сейчас мы используем Spring Boot 2 и JUnit 5), разные JUnit, реализованные разными разработчиками, теперь используют разные шаблоны с:

  • @ExtendWith
  • @RunWith

Сегодня в чем разница между ними двумя и действительно ли они нужны нам для наших модульных тестов или встроены в какую-то новую аннотацию Spring Boot?

Ответ №1:

Если вы используете Junit версии < 5, поэтому вам придется использовать @RunWith(SpringRunner.class) or @RunWith(MockitoJUnitRunner.class) и т.д.

Если вы используете Junit версии = 5, поэтому вам придется использовать @ExtendWith(SpringExtension.class) или @ExtendWith(MockitoExtension.class) и т.д.

  1. SpringRunner
  2. MockitoJUnitRunner
  3. Весеннее расширение
  4. Макет расширения

Ответ №2:

Ответ можно найти в документации:

Если вы используете JUnit 4, не забудьте добавить @RunWith(SpringRunner.class ) для вашего теста, в противном случае аннотации будут проигнорированы. Если вы используете JUnit 5, нет необходимости добавлять эквивалентный @ExtendWith(SpringExtension.class ) как @SpringBootTest и другой @…Тестовые примечания уже снабжены им

.

Ответ №3:

@RunWith это старая аннотация из JUnit 4 для использования тестовых запускателей. Если вы используете JUnit 5 (Jupiter), вам следует использовать @ExtendWith для использования расширений JUnit.

Ответ №4:

Важное отличие, которое было введено с @ExtendWith , заключается в том, что он может получать массив расширений, позволяющих использовать многие из них в одном тесте. Что-то подобное можно сделать

 @ExtendWith({MockitoExtension.class, LogAsserterExtension.class})
class MyTest
  

@RunWith Еще в JUnit 4 был разрешен только один класс Runner, и у вас возникали проблемы, когда вы хотели использовать Mockito и параметры в тесте, например, потому что вы не могли использовать MockitoJUnitRunner и JUnitParamsRunner одновременно.