当前位置:Java -> JUnit, 4, 5, Jupiter, Vintage
在发布了JUnit 5之后,许多开发人员将这个出色的新库添加到他们的项目中,因为与其他版本不同,在这个新版本中,不需要从JUnit 4迁移到JUnit 5,您只需要将新库包含在您的项目中,有了JUnit 5的引擎,您可以使用JUnit 5做新的测试,而使用JUnit 4或3做旧的测试时不会出现问题。
但是在一个大型项目中会发生什么情况呢?一个项目是10年前建立的,同时兼容两个版本的JUnit运行。
新的开发人员开始在这个项目上工作,其中一些有JUnit经验,其他人没有。使用JUnit 5创建新的测试,使用JUnit 4创建新的测试,然后在某个时刻,一个没有知识的开发人员当他们要在已经创建的JUnit 5测试中创建一个新情景时,他们只是包含了一个JUnit 4的注解,测试变成了一个混合体,一些是JUnit 4的@Test
,一些是JUnit 5的@Test
,并且每天都越来越难以移除JUnit 4库。
那么,如何解决这个问题呢?首先,您需要向团队展示什么是来自JUnit 5,什么是来自JUnit 4,以便新的测试使用JUnit 5而不是JUnit 4进行创建。之后必须遵循童子军规则,每当他们通过JUnit 4测试时,他们必须迁移到JUnit 5。
让我们来看一下JUnit 5发布的主要变化。一切都从名称开始,在JUnit 5中,您看不到名为org.junit5的包,而是org.junit.jupiter。总而言之,您看到的所有带“Jupiter”的东西,都意味着来自JUnit 5。他们选择这个名字是因为Jupiter以“JU”开头,并且是太阳系中的第五个行星。
另一个变化是关于@Test
,这个注解被移动到了一个新的包:org.junit.jupiter.api,现在不再使用“expected”或“timeout”之类的属性,而是使用扩展。例如,对于超时,现在您可以使用以下注解:@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
。另一个变化是,测试方法和类都不再需要是公共的。
现在,您在测试配置中不再使用@Before
和@After
,而是使用@BeforeEach
和@AfterEach
,而且还有@BeforeAll
和@AfterAll
。
要忽略测试,现在您必须使用@Disable
而不是@Ignore
。
在JUnit 5中发布的一个重要功能是@ParameterizedTest
注解,使用它可以多次运行一个测试,并使用不同的参数。例如,如果您想测试一个创建某个对象的方法,并且您想验证字段是否填充正确,您只需进行以下操作:
@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。因此,如果您在2024年仍然在使用JUnit 4,并且您的项目是一个大型项目,那么您可能会有一些依赖项使用JUnit 4。我建议您分析您的库,查看其中是否有一些使用JUnit 4的库。
在下面的图片中,我使用了IntelliJ的依赖分析器。
正如您所见,jersey-test正在使用JUnit 4,也就是说,即使我从项目中移除了JUnit 4,由于Jersey的存在,JUnit 4仍然可用。最简单的方法是将jersey升级到2.35,因为JUnit 5是在jersey-test 2.35中引入的,但我不能更新jersey-test框架,因为其他库会在我的项目中出现故障。在这种情况下,我该怎么做?
我可以通过Maven的Dependency Exclusions来排除Jersey中的JUnit,这样JUnit 4就不再被使用,而是我们的JUnit 5。
当你运行一些使用Jersey的测试时,它们不会加载,因为Jersey中有一些方法使用了JUnit 4注解,setUp
和tearDown
,使用了@Before
和@After
。要解决这个问题,你可以创建一个“配置类”,它继承自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();
}
}
所以,如果你已经检查了你的库,并且没有一个依赖于JUnit 4,最终你可以将所有的测试迁移到JUnit 5,对于这个过程,有一个很好的工具可以帮你省去大量的工作,那就是OpenRewrite,一个源代码自动重构生态系统,它将会将你所有的旧包、旧注解等全部变更为新的。
就是这样,现在你和你的团队可以享受JUnit 5,并放松你们的心,知道新的测试将会使用JUnit 5创建,而项目也不会变成一个“Frankenstein”。所以,请记住,保持你的项目更新,因为如果你忘记了你的库,每一天都会更难以更新,始终使用规范,并且遵循规范的框架,并且在你的代码中有一个好的设计,这可以让你改变和移动得更轻松。
推荐阅读: 百度面经(10)
本文链接: JUnit, 4, 5, Jupiter, Vintage