После выпуска JUnit 5, множество разработчиков просто добавили эту потрясающую новую библиотеку в свои проекты, потому что в отличие от других версий, в этой новой версии не обязательно мигрировать с JUnit 4 на 5, вам просто нужно включить новую библиотеку в ваш проект, и с помощью всего двигателя JUnit 5 вы можете проводить новые тесты, используя JUnit 5, а старые с JUnit 4 или 3将继续 работать без проблем.
Но что может произойти в большом проекте, проекте, который был создан 10 лет назад с параллельным использованием двух версий JUnit?
Новые разработчики начали работать над проектом, некоторые из них с опытом использования JUnit, другие нет. Новые тесты создаются с использованием JUnit 5, новые тесты создаются с использованием JUnit 4, и в какой-то момент разработчик без соответствующих знаний, создавая новый сценарий в тесте JUnit 5, уже созданном, просто включает аннотацию JUnit 4, и тест становится смесью, где некоторые @Test
из JUnit 4 и некоторые @Test
из JUnit 5, и каждый день становится сложнее удалить библиотеку JUnit 4.
Итак, как решить эту проблему? В первую очередь, вам нужно показать своей команде, что из JUnit 5, а что из JUnit 4, чтобы новые тесты создавались с использованием JUnit 5 вместо JUnit 4. После этого необходимо следовать правилу разведчика, whenever они проходят тест JUnit 4, они должны мигрировать на JUnit 5.
Давайте рассмотрим основные изменения, выпущенные в JUnit 5. Всё начинается с названия, в JUnit 5 вы не видите пакетов叫做 org.junit5, а скорее org.junit.jupiter. Итогом является, что всё, что вы видите с суффиксом “Jupiter”, означает, что это из JUnit 5. Они выбрали это имя, потому что Юпитер начинается с “JU” и является fifth планетой от солнца.
Другое изменение касается аннотации @Test
, она была перемещена в новый пакет: org.junit.jupiter.api и теперь атрибуты такие как “expected” или “timeout” больше не используются, вместо них используется расширение. Например, для таймаута теперь у вас есть аннотация для этого: @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
. Другое изменение заключается в том, что методы и классы тестов не должны быть public.
Теперь вместо использования @Before
и @After
в вашей конфигурации теста, вам нужно использовать @BeforeEach
и @AfterEach
, и также у вас есть @BeforeAll
и @AfterAll
.
Для пропуска тестов теперь вам нужно использовать @Disable
вместо @Ignore
.
A great news that was released in JUnit 5 was the annotation @ParameterizedTest
, with that is possible to run one test multiple times with different arguments. For example, if you want to test a method that creates some object and you want to validate if the fields are filled correctly, you just do the following:
@ParameterizedTest
@MethodSource("getInvalidSources")
void shouldCheckInvalidFields(String name, String job, String expectedMessage) {
Throwable exception = catchThrowable(() -> new Client(name, job));
assertThat(exception).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining(expectedMessage);
}
static Stream<Arguments> getInvalidSources() {
return Stream.of(Arguments.arguments("Jean Donato", "", "Job is empty"),
Arguments.arguments("", "Dev", "Name is empty"));
}
В JUnit 5 есть множество полезных функций, я рекомендую вам ознакомиться с Руководством пользователя JUnit 5, чтобы проанализировать, что будет полезно для вашего проекта.
Теперь, когда все разработчики знают, что было изменено в JUnit 5, вы можете начать процесс удаления JUnit 4 из вашего проекта. Так что, если вы до сих пор используете JUnit 4 в 2024 году, и ваш проект большой, вероятно, у вас будут некоторые зависимости, использующие JUnit 4. Я рекомендую вам проанализировать ваши библиотеки, чтобы проверить, используют ли некоторые из них JUnit 4.
На рисунке ниже я использую анализатор зависимостей из IntelliJ.
Как вы можете видеть, jersey-test использует JUnit 4, то есть, даже если я удалю JUnit 4 из своего проекта, JUnit 4 будет доступен для использования из-за Jersey. Легче всего будет обновить jersey до версии 2.35, так как JUnit 5 был введен в jersey-test 2.35, но я не могу обновить фреймворк jersey-test, так как другие библиотеки сломаются в моем проекте. Так что в этом случае я могу сделать?
I can exclude JUnit from Jersey with Dependency Exclusions from Maven (like the image below). That way JUnit 4 will not be used anymore, but rather our JUnit 5.
Когда вы запускаете некоторые тесты, использующие Jersey, они не будут загружены, потому что в Jersey есть методы, использующие аннотации JUnit 4, setUp
и tearDown
, с @Before
и @After
. Чтобы решить эту проблему, вы можете создать одну “Конфигурационную класс”, которая extends JerseyTest
и реализует setUp
и tearDown
с @BeforeEach
и @AfterEach
, вызывая super.setUp()
и super.TearDown()
.
public class JerseyConfigToJUnit5 extends JerseyTest {
@BeforeEach
public void setUp() throws Exception {
super.setUp();
}
@AfterEach
public void tearDown() throws Exception {
super.tearDown();
}
}
Итак, если вы уже проверили свои библиотеки и nobody не имеет больше зависимостей от JUnit 4, вы наконец можете мигрировать все свои тесты на JUnit 5, для этого процесса есть хороший инструмент, который сэкономит вам много работы, это OpenRewrite, автоматизированная среда для рефакторинга исходного кода, они изменят все ваши старые пакеты, старые аннотации и все на новые.
Вот и все,folks, теперь вы и ваши队友ы можете наслаждаться JUnit 5 и relax你们的 mind, зная, что новые тесты будут создаваться с использованием JUnit 5 и проект не превратится в Frankensteina. Так что помните, держите ваш проект в актуальном состоянии, потому что если вы забудете о своих библиотеках, каждый день будет все сложнее их обновлять, всегда используйте спецификации и фреймворки, которые следуют спецификациям, и داشتهйте хороший дизайн в вашем коде, это позволяет вам легко изменять и передвигать.
Source:
https://dzone.com/articles/junit-4-5-jupiter-vintage-how-to-deal