从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

    • SpringBoot 教程-尚硅谷

      • SpringBoot 课程介绍
      • Spring 和 SpringBoot
      • HelloWorld
      • 了解自动配置原理
      • 底层注解-@Configuration 详解
      • 底层注解-@Import 导入组件
      • 底层注解-@Conditional 条件装配
      • 原生配置文件引入-@ImportResource
      • 底层注解-配置绑定 @ConfigurationProperties
      • 自动配置原理
      • 自动配置流程
      • Lombok 简化开发
      • DevTools
      • Spring-Initailizr
      • 配置文件-Yaml 用法
      • Web 开发简介
      • web 开发-静态资源规则于定制化
      • 静态资源配置原理
      • Rest 映射及源码解析
      • 请求映射原理
      • 常用参数注解使用
      • MatrixVariable:矩阵变量
      • 各种类型参数解析原理
      • Servlet-API 参数解析原理
      • Model、Map 参数解析原理
      • 自定义对象参数绑定原理
      • 自定义 Converter 原理
      • 数据响应原理
      • 内容协商原理
      • 基于请求参数的内容原理
      • 自定义 MessageConverter 原理
      • Thymeleaf 初体验
      • web 实验-后台管理系统
      • web 实验-抽取公共页面
      • web 实验-遍历数据
      • 源码分析-视图解析器与视图
      • 拦截器-登录检查与静态资源放行
      • 拦截器的执行时机和原理
      • 单文件和多文件上传的使用
      • 文件上传原理
      • 错误处理机制
      • 错误处理-底层组件源码分析
      • 异常处理流程
      • 几种异常处理原理
      • Web 原生对象注入
      • 嵌入式 Servlet 容器
      • 定制化原理
      • 数据库场景的自动配置分析和整合测试
      • 自定义方式整合 Druid
      • 通过 starter 整合 Druid
      • 整合 Mybatis
      • 使用注解整合 Mybatis
      • 整合 MybatisPlus 操作数据库
      • MybatisPlus-列表分页展示
      • 整合 Redis
      • 单元测试-Junit5
        • 简介
        • 常用注解
        • @DisplayName
        • @BeforeEach,@AfterEach
        • @Before
        • @Tag
        • @Disabled
        • @Timeout
        • @ExtendWith
        • @RepeatedTest
        • 源码
      • 单元测试-断言机制
      • 单元测试-前置条件
      • 单元测试-嵌套测试
      • 单元测试-参数化测试
      • 指标监控-基本概念
      • 指标监控-配置 EndPoint
      • 指标监控-可视化
      • 原理解析-Profile 功能
      • 配置文件深入
      • 自定义 Starter
      • SpringApplication 初始化过程
      • SpringBoot 完整启动过程
  • Java
  • SpringBoot
  • SpringBoot 教程-尚硅谷
2023-08-22
目录

单元测试-Junit5

# 560.单元测试-Junit5

接下来讲讲 Junit ‍

# 简介

Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库。

JUnit5 与之前版本的 Junit 框架有很大的不同,由三个不同子项目的几个不同模块组成:

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage ‍

说明:

  • JUnit Platform: Junit Platform 是在 JVM 上启动测试框架的基础,不仅支持 Junit 自制的测试引擎,其他测试引擎也都可以接入。简单来说,就是 Junit 不仅仅想当一个测试框架,而是一个测试平台,这个 Platform 则是基础。
  • JUnit Jupiter: JUnit Jupiter 提供了 JUnit5 的新的编程模型,是 JUnit5 新特性的核心,内部包含了一个测试引擎,在 Junit Platform 上运行。
  • JUnit Vintage: 由于 JUint 已经发展多年,为了照顾老的项目,JUnit Vintage 提供了兼容 JUnit4.x,Junit3.x 的测试引擎。 ‍ 我们在创建 SpringBoot 的时候,已经引入了 Junit:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
1
2
3
4
5

‍ 分析依赖可知,确实用的是 Junit5:

在代码中,引入的也是 jupiter:

‍

需要注意的是,在 SpringBoot 2.4 版本之后,移除了 Vintage,想要兼容得自行添加依赖,参考 发行说明 (opens new window):

# JUnit 5’s Vintage Engine Removed from spring-boot-starter-test

If you upgrade to Spring Boot 2.4 and see test compilation errors for JUnit classes such as org.junit.Test, this may be because JUnit 5’s vintage engine has been removed from spring-boot-starter-test. The vintage engine allows tests written with JUnit 4 to be run by JUnit 5. If you do not want to migrate your tests to JUnit 5 and wish to continue using JUnit 4, add a dependency on the Vintage Engine, as shown in the following example for Maven:

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
1
2
3
4
5
6
7
8
9
10
11

SpringBoot 整合 Junit 后,怎么用:

  • 编写测试方法,并加上@Test 注解(注意需要使用 Junit5 版本的注解)
  • Junit 类 具有 Spring 的功能,可以使用@Autowired。使用@Transactional 标注测的试方法,在测试完成后还会自动回滚 ‍

# 常用注解

JUnit5 的注解与 JUnit4 的注解有所变化,更多的可以参考 官网文档 (opens new window),大致如下

  • @Test:表示方法是测试方法。但是与 JUnit4 的@Test 不同,他的职责非常单一,不能声明任何属性,拓展的测试将会由 Jupiter 提供额外测试
  • @DisplayName:为测试类或者测试方法设置展示名称
  • @BeforeEach:表示在每个单元测试之前执行
  • @AfterEach:表示在每个单元测试之后执行
  • @BeforeAll:表示在所有单元测试之前执行
  • @AfterAll:表示在所有单元测试之后执行
  • @Tag:表示单元测试类别,类似于 JUnit4 中的@Categories,这里不展开
  • @Disabled:表示测试类或测试方法不执行,类似于 JUnit4 中的@Ignore
  • @Timeout:表示测试方法运行如果超过了指定时间将会返回错误
  • @ExtendWith:为测试类或测试方法提供扩展类引用
  • @RepeatedTest:表示方法可重复执行,并可以指定重复次数

# @DisplayName

我们新增一个测试类:

package com.peterjxl.learnspringbootwebadmin;
import org.junit.jupiter.api.Test;

public class Junit5Test {

    @Test
    void testDisplayName(){
        System.out.println("testDisplayName");
    }
}
1
2
3
4
5
6
7
8
9
10

‍ 运行结果:默认左侧展示的是类名和方法名:

如果加上了 @DisplayName:

package com.peterjxl.learnspringbootwebadmin;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

@DisplayName("Junit5功能测试类")
public class Junit5Test {

    @Test
    @DisplayName("测试DisplayName")
    void testDisplayName(){
        System.out.println("testDisplayName");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

‍ 运行结果:

# @BeforeEach,@AfterEach

新增方法:

@BeforeEach
void testBeforeEach(){
    System.out.println("测试就要开始了.....");
}

@AfterEach
void testAfterEach(){
    System.out.println("测试结束了.....");
}
1
2
3
4
5
6
7
8
9

‍ 运行结果:

测试就要开始了.....
testDisplayName
测试结束了.....
1
2
3

@BeforeEach 是会在 每一个 测试方法之前都执行,注意是每一个。我们可以新增多一个测试方法:

@Test
@DisplayName("测试方法2")
void test2(){
    System.out.println("test2");
}
1
2
3
4
5

然后我们直接运行整个测试类,这样每个测试方法都会执行一遍:

运行结果:

测试就要开始了.....
test2
测试结束了.....

测试就要开始了.....
testDisplayName
测试结束了.....
1
2
3
4
5
6
7

‍

# @Before

@BeforeAll
    static void testBeforeAll(){
        System.out.println("所有测试就要开始了.....");
    }

    @AfterAll
    static void testAfterAll(){
        System.out.println("所有测试结束了.....");
    }
1
2
3
4
5
6
7
8
9

运行结果:

所有测试就要开始了.....
测试就要开始了.....
test2
测试结束了.....
测试就要开始了.....
testDisplayName
测试结束了.....
所有测试结束了.....

1
2
3
4
5
6
7
8
9

‍ 注意 @BeforeAll 和 @AfterAll 的方法必须加上 static。 ‍

# @Tag

# @Disabled

@Disabled 的方法相当于不执行:

@Test
@DisplayName("测试方法2")
@Disabled
void test2(){
    System.out.println("test2");
}
1
2
3
4
5
6

# @Timeout

新增方法:

@Test
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
void testTimeout() throws InterruptedException {
    Thread.sleep(600);
}
1
2
3
4
5

这里我们指定数值是 500,单位是毫秒,也就是 500 毫秒后超时(也可以不指定单位,默认是秒) ‍ 运行结果:

所有测试就要开始了.....
测试就要开始了.....
测试结束了.....

java.util.concurrent.TimeoutException: testTimeout() timed out after 500 milliseconds
		... 58 more
1
2
3
4
5
6

# @ExtendWith

在使用 Spring 时,我们 Spring 整合 Junit (opens new window) 是要用注解 @RunWith 的,不然就不能使用 @Autowired;

在 SpringBoot 中,我们直接使用 @SpringbootTest,即可使用 SpringBoot 的功能,而该注解其实是一个复合注解,使用了 @ExtendWith,@ExtendWith 就相当于 @RunWith:

@ExtendWith({SpringExtension.class})
public @interface SpringBootTest 
1
2

‍ 如果我们想要使用其他平台,就得修改 @ExtendWith 里的值,这就是该注解的作用

# @RepeatedTest

‍ 新增方法:

@RpeatedTest(5)
void test5(){
    System.out.println("test5");
}
1
2
3
4

‍ 运行结果:

# 源码

已将本文源码上传到 Gitee (opens new window) 或 GitHub (opens new window) 的分支 demo17,读者可以通过切换分支来查看本文的示例代码 ‍

上次更新: 2025/6/3 09:31:54
整合 Redis
单元测试-断言机制

← 整合 Redis 单元测试-断言机制→

最近更新
01
语雀文档一键下载至本地教程
07-04
02
要成功,就不要低估环境对你的影响
07-03
03
血泪教训:电子设备要定期开机
07-02
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式