Junit 5 “食用”指南(一)

271 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 4 天,点击查看活动详情

前言

在公司项目中,常常见到 Test 单元测试类中乱用 Junit4 和 Junit5 的情况。事实上,自从 SpringBoot 2.4.x 版本开始,spring-boot-start-test 默认仅支持 Junit5 了,因此很多老项目一旦升级到 2.4.x 之后版本,就会出现测试类一边爆红,提示无法导入对应的 @Test 注解等等。

因此,有必要好好学习一下 Junit 5 的用法,以及在 SpringBoot 集成 Junit 5 的用法。

1. 引入依赖

 <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
 <dependency>
     <groupId>org.junit.jupiter</groupId>
     <artifactId>junit-jupiter-engine</artifactId>
     <version>5.8.2</version>
     <scope>test</scope>
 </dependency>

Junit5 项目依赖图如下

image-20220426232025373.png

核心有 3 个部分

  • JUnit Platform:这是负责启动 Junit 框架的平台,每一个单元测试通过平台进而加载到 JVM 中运行
  • JUnit Jupiter:包含 Junit 5 的扩展注解功能
  • JUnit Vintage:对 Junit3 和 Junit4 在 Junit5 平台上运行提供支持

一般我们创建 SpringBoot 工程时,有些版本会自动将 spring-boot-test 框架中的 Junit Vintage 排除,例如

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
     <exclusions>
         <exclusion>
             <groupId>org.junit.vintage</groupId>
             <artifactId>junit-vintage-engine</artifactId>
         </exclusion>
     </exclusions>
 </dependency>

这样的好处是,@Test注解导入的包只有 Junit5 的 import org.junit.jupiter.api.Test;,如果不排除的话,由于 junit-vintage-engine是提供对 Junit3 和 Junit4 的支持的,所以会错误导入 Juint4 的包 import org.junit.Test;

2. 基础注解使用

 package com.example.springbootjunit5samples;
 ​
 import org.junit.jupiter.api.*;
 ​
 public class Junit5Tests {
 ​
     @DisplayName("静态方法,在整儿测试类中加载一次,在所有方法执行之前")
     @BeforeAll
     static void testBeforeAll() {
         System.out.println("testBeforeAll...");
     }
 ​
     @DisplayName("在每个 @Test 方法执行之前都要执行一次")
     @BeforeEach
     void testBeforeEach() {
         System.err.println("testBeforeEach####");
     }
 ​
     @Test
     void testService1() {
         System.out.println("test Service method 1");
     }
 ​
     @Test
     void testService2() {
         System.out.println("test Service method 2");
     }
 ​
     @Disabled("标记该方法已被废弃,不使用")
     @Test
     void testService3() {
         System.out.println("test Service method 3");
     }
 ​
     @DisplayName("静态方法,在整儿测试类中加载一次,在所有方法执行完之后")
     @AfterEach
     void testAfterEach() {
         System.err.println("testAfterEach####");
     }
 ​
     @DisplayName("在每个 @Test 方法执行之后都要执行一次")
     @AfterAll
     static void testAfterAll() {
         System.out.println("testAfterAll...");
     }
 ​
 }

直接运行 Junit5Tests 这个类,运行结果,如下所示

image-20220426235059627.png

根据运行结果,可以很清楚的明白@DisplayName@Disabled@BeforeAll@AfterAll@BeforeEach@AfterEach这几个不同于 Junit4 的注解的基本用法。

\