当前位置:Java -> JUnit, 4, 5, Jupiter, Vintage

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的依赖分析器。

Dependency Analyzer








正如您所见,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注解,setUptearDown,使用了@Before@After。要解决这个问题,你可以创建一个“配置类”,它继承自JerseyTest,实现setUptearDown,并使用@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