一起养成写作习惯!这是我参与「掘金日新计划 · 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 项目依赖图如下
核心有 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 这个类,运行结果,如下所示
根据运行结果,可以很清楚的明白@DisplayName,@Disabled,@BeforeAll,@AfterAll,@BeforeEach,@AfterEach这几个不同于 Junit4 的注解的基本用法。
\