目录

  • 一、JUnit 5 是什么?
    • JUnit Platform
    • JUnit Jupiter
    • JUnit Vintage
  • 二、为什么使用 JUnit 5 ?
  • 三、JUnit 4 和 JUnit 5 的区别
    • 1.导入
    • 2.@Test 注解
    • 3.超时写法发生变化
    • 4.其它注解
    • 5.断言
    • 6.假设
    • 7.扩展
  • 四、创建项目集成 JUnit 5 进行单元测试
    • 1.项目说明
    • 2.创建 Spring Initializr 项目 junit
      • (1)添加依赖
      • (2)添加配置
      • (3)新建实体类 User
      • (4)新建控制类 LoginController
    • 3.创建 Junit 5 测试示例
      • (1)创建测试类 LoginControllerTest
      • (2)添加注解
      • (3)测试示例
        • ①断言:判断条件是否为 true 或 false
        • ②断言:判断两个值是否相等
        • ③断言:判断条件是否为 null 或 not null
        • ④断言:判断断言是否超时
        • ⑤断言:组合断言
        • ⑥重复测试
        • ⑦参数化测试

一、JUnit 5 是什么?

与以前版本的 JUnit 不同,JUnit 5 由来自三个不同子项目的几个不同模块组成。

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

JUnit Platform

是启动 JVM 上测试框架的基础。它还定义了用于开发在平台上运行的测试框架的 API。此外,该平台还提供了一个控制台启动器,用于从命令行启动平台,并提供 JUnit 平台套件引擎,用于使用平台上的一个或多个测试引擎运行自定义测试套件。

JUnit Jupiter

是新的编程模型和扩展模型的组合,用于在 JUnit 5 中编写测试和扩展。Jupiter 子项目提供了一个用于在平台上运行基于 Jupiter 的测试。

JUnit Vintage

提供了一个用于在平台上运行基于 JUnit 3 和 JUnit 4 的测试。

二、为什么使用 JUnit 5 ?

至少有以下优点:

  1. JUnit 5 利用了Java 8 或更高版本的特性,例如 lambda 函数,使测试更强大,更容易维护。
  2. JUnit 5 可以同时使用多个扩展,可以轻松地将 Spring 扩展与其他扩展(如自定义扩展)结合起来,包容性强,可以接入其他的测试引擎。
  3. 功能更强大,提供了新的断言机制、参数化测试、重复性测试等新功能。

从 JUnit 4 切换到 JUnit 5 非常简单,步骤如下:

  1. 将库和构建系统从 JUnit 4 更新到 JUnit 5。确保在测试运行时路径中包含 junit-vintage-engine ,以允许现有的测试执行。
  2. 使用新的 JUnit 5 构造开始构建新的测试。

三、JUnit 4 和 JUnit 5 的区别

1.导入

JUnit 5 使用新的 org.junit.jupiter 包,Junit 4 使用的是 org.junit 包。

2.@Test 注解

@Test 注解不再有参数,每个参数都被移到了一个函数中。

3.超时写法发生变化

4.其它注解

@Before 变成了 @BeforeEach
@After 变成了 @AfterEach
@BeforeClass 变成了 @BeforeAll
@AfterClass 变成了 @AfterAll
@Ignore 变成了 @Disabled
@Category 变成了 @Tag
@Rule 和 @ClassRule 没有了,用 @ExtendWith 和 @RegisterExtension 代替

5.断言

JUnit 5 断言在 org.junit.jupiter.api.Assertions 中。大多数常见的断言,如 assertEquals() 和 assertNotNull(),和以前有所不同,错误信息放在了最后一个参数,例如:
assertEquals(“my message”,1,2) 变为 assertEquals(1,2,”my message”)

大多数断言现在接受一个构造错误信息的lambda,只有当断言失败时才会被调用。

6.假设

假设已被移至 org.junit.jupiter.api.Assumptions。
同样的假设也存在,但它们支持 BooleanSupplier 以及 Hamcrest 匹配器(http://hamcrest.org/)来匹配条件。Lambdas(类型为 Executable)可以用来在条件满足时执行代码。

7.扩展

在 JUnit 4中,自定义框架通常意味着使用 @RunWith 注释来指定一个自定义的运行器。使用多个运行器是有问题的,通常需要链式或使用 @Rule。在 JUnit 5 中已经得到了简化和改进。

四、创建项目集成 JUnit 5 进行单元测试

1.项目说明

新建 Spring Initializr 项目 junit,项目下新建 entity、controller 类。项目创建示例说明 JUnit 5 的使用。
项目目录结构:

2.创建 Spring Initializr 项目 junit

(1)添加依赖

添加依赖,如果已按截图操作,pom.xml 还需引入 Junit 5 依赖:

<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>

完整的 pom.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.chaoyue</groupId><artifactId>junit</artifactId><version>0.0.1-SNAPSHOT</version><name>junit</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><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></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

(2)添加配置

application.yml 文件中添加如下配置:

server:port: 8080

(3)新建实体类 User

为减少不必要的代码,引入 lombok 依赖。实体类代码如下:

package com.chaoyue.junit.entity;import lombok.Data;@Data
public class User {//    @TableId(type = IdType.AUTO)private Long id; // idprivate String username; // 用户名private String password; // 密码
}

(4)新建控制类 LoginController

package com.chaoyue.junit.controller;import com.chaoyue.junit.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class LoginController {@GetMapping("getUserInfo")public String getUserInfo() {// 获取用户信息User userInfo = new User();userInfo.setId(1L);userInfo.setUsername("admin");userInfo.setPassword("123456");return userInfo.toString();}}

3.创建 Junit 5 测试示例

(1)创建测试类 LoginControllerTest

在LoginController 类上使用快捷键 ctrl + shift + t 打开弹窗:
点击【Create New Test…】创建测试类:

(2)添加注解

测试类添加注解 @SpringBootTest:

package com.chaoyue.junit.controller;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
class LoginControllerTest {@BeforeEachvoid setUp() {}@AfterEachvoid tearDown() {}@Testvoid getUserInfo() {}
}

(3)测试示例

①断言:判断条件是否为 true 或 false

    /*** assertTrue、assertFalse 判断条件是否为 true 或 false*/@Test@DisplayName("测试断言 assertTrue、assertTrue")void testTrue() {assertTrue(1 > 2 );
//        assertFalse(1 > 2 );}

②断言:判断两个值是否相等

    /*** assertEquals、assertNotEquals 判断两个值是否相等*/@Test@DisplayName("测试断言 assertEquals、assertNotEquals")void testEquals() {assertEquals(1, 2 );
//        assertNotEquals(1, 2 );}

③断言:判断条件是否为 null 或 not null

    /*** assertNull、assertNotNull 判断条件是否为 null 或 not null*/@Test@DisplayName("测试断言 assertNull、assertNotNull")void testNotNull() {assertNotNull(new Object());
//        assertNull(new Object());}

④断言:判断断言是否超时

/*** assertTimeout 判断断言是否超时*/
@Test
@DisplayName("测试断言 assertTimeout")
void testTimeout() {String result = assertTimeout(ofSeconds(2),() -> {Thread.sleep(1000);return "未超时";});System.out.println(result);
}

⑤断言:组合断言

/*** assertAll 组合断言,当内部所有断言都正确执行才算通过*/
@Test
@DisplayName("测试组合断言")
void testTAll() {assertAll("测试组合断言",() -> {assertTrue(1 < 2, "断言1");},() -> {assertNotNull(new Object(), "断言2");},() -> {assertEquals(1,1);});
}

⑥重复测试

/*** RepeatedTest 重复测试*/
@RepeatedTest(3)
@DisplayName("重复测试")
void testRepeat() {System.out.println("重复测试");
}

⑦参数化测试

/*** ParameterizedTest 参数化测试*/
@ParameterizedTest
@ValueSource(strings = {"参数1", "参数2", "参数3"})
@DisplayName("参数化测试")
void testParam(String param) {assertEquals(param, "参数1");System.out.println(param);
}

PS:JUnit 5 官网:https://junit.org/junit5/

【SpringBoot深入浅出系列】SpringBoot之集成JUnit5进行单元测试相关推荐

  1. 【SpringBoot深入浅出系列】SpringBoot之实现支付宝扫码支付(沙箱环境编码实现)

    目录 一.准备工作 1.应用 APPID 2.商户私钥,即应用私钥 3.支付宝公钥 4.签名方式 5.字符编码格式 6.支付宝网关 二.沙箱环境编码实现 1.项目说明 2.创建 Spring Init ...

  2. SpringBoot 精通系列-SpringBoot整合Redis的常用操作

    导语   在之前的博客中介绍过关于Memcache的使用,这篇文章中主要介绍关于Redis的有关概念及如何与SpringBoot整合使用.   首先Redis是目前使用最为广泛的缓存中间件,相比较Me ...

  3. 【SpringBoot深入浅出系列】SpringBoot之集成MyBatis-Plus

    目录 一.MyBatis-Plus 是什么? 二.创建项目集成 MyBatis-Plus 1.项目说明 2.创建 Spring Initializr 项目 mybatisplus (1).添加依赖 ( ...

  4. 【SpringBoot深入浅出系列】SpringBoot之实现支付宝扫码支付(开发前准备)

    目录 一.平台入驻 1.入驻准备 2.整体流程 二.创建应用 1.创建应用 2.添加应用功能 3.配置应用环境 4.设置 接口加签方式(密钥/证书) 5.生成密钥和配置接口加签方式 6.提交审核 三. ...

  5. 【SpringBoot深入浅出系列】SpringBoot之调用腾讯云短信接口发送短信

    目录 一.开发前准备 1.创建签名 2.创建正文模板管理 3.创建应用 4.创建secretId和secretKey 二.开发 1.创建 Spring Initializr 项目 tengxunsms ...

  6. SpringBoot 精通系列-SpringBoot如何操作Memcache

    导语   随着公司的业务速度的提高,数据持久化的问题就凸显出来,很多的场景下使用的是缓存技术来解决请求数据库的压力,这种也是缓存技术使用最多的场景之一,当然在高并发.分布式Session场景下,也会使 ...

  7. WebService CXF系列: SpringBoot同一个项目中集成JaxWS和JaxRS

    WebService CXF系列: SpringBoot同一个项目中集成JaxWS和JaxRS 介绍 项目介绍 项目架构 项目介绍 项目集成的原则 SpringBoot集成JaxWS 1. JaxWs ...

  8. SpringBoot笔记系列目录

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...

  9. SpringBoot基础系列-使用日志

    原创文章,转载请标注出处:<SpringBoot基础系列-使用日志> 一.概述 SpringBoot使用Common Logging进行日志操作,Common Logging是一个日志功能 ...

  10. httpwebrequest超时时间timeout设置无效_【SpringBoot WEB 系列】RestTemplate 之超时设置...

    [SpringBoot WEB 系列]RestTemplate 之超时设置 一般来讲我们访问外部资源时,需要做一个保护,比如最常见的添加一个超时设置,避免一直被阻塞,RestTemplate 可以通过 ...

最新文章

  1. python 关闭exe程序进程
  2. 陈天桥雒芊芊脑机接口中心等团队研究登顶刊:超声波“读心”
  3. JAVA-JAVA WEB开发工具下载与安装
  4. 每天九点十分开始每半小时一次执行一个cron_每天通勤4小时!西咸双城生活的上班族,不简单...
  5. jboss fuse 教程_JBoss Fuse:使用JEXL的动态蓝图文件
  6. Java使用者的延期执行
  7. Windows 11的19个新功能
  8. python基于svm的异常检测_[scikit learn]:异常检测-OneClassSVM的替代方案
  9. [NOI2015Day1]解题报告
  10. PID控制算法介绍与C程序实现
  11. 袖珍电子书,雄心壮志永不变
  12. js自动生成手机扫描二维码就可以实现自动下载apk的二维码
  13. 复杂网络 社交网络_通过角色的动态社交网络探索哈利·波特
  14. 查理·芒格提炼的9个思维模型
  15. Ubuntu开机启动黑屏,只有鼠标
  16. android ping tools,PingTools
  17. 图像分辨率、像素总数、文件大小之间的详细区别
  18. 关于字体和字体微调(Hinting )的知识
  19. r语言的MASS包干什么的_R语言常用包汇总
  20. mesh repair

热门文章

  1. dbv oracle驱动,oracle dbv使用详解
  2. 图解机器学习算法(9) | GBDT模型详解(机器学习通关指南·完结)
  3. 自然语言处理之语料库
  4. 进度管理案例分析——常见问题及答案
  5. 给ftp服务器创建文件夹,ftp服务器上创建文件夹
  6. Java中的封装,继承和多态(详解)
  7. python 微信小程序签到系统_简易微信小程序签到功能
  8. Linux基础——Web(三)Nginx反向代理2
  9. 怎么用电脑把优酷的kux格式转换成mp4格式
  10. html思维导图word版,[精选]思维导图(完美排版word).doc