作者:海向
来源:www.cnblogs.com/haixiang/p/13812363.html

为什么使用JUnit5

  • JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余。

  • JUnit5易扩展,包容性强,可以接入其他的测试引擎。

  • 功能更强大提供了新的断言机制、参数化测试、重复性测试等新功能。

  • ps:开发人员为什么还要测试,单测写这么规范有必要吗?其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。

简介

如图,JUnit5结构如下:

  • JUnit Platform:这是Junit提供的平台功能模块,通过它,其它的测试引擎都可以接入Junit实现接口和执行。

  • JUnit JUpiter:这是JUnit5的核心,是一个基于JUnit Platform的引擎实现,它包含许多丰富的新特性来使得自动化测试更加方便和强大。

  • JUnit Vintage:这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在JUnit5下正常运行。

依赖引入

我们以Spring Boot2.3.1为例,引入如下依赖,防止使用旧的junit4相关接口我们将其依赖排除。

Spring Boot 基础就不介绍了,推荐看下面这个最新的实战教程。

https://github.com/javastacks/spring-boot-best-practice

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

常用注解

  • @BeforeEach:在每个单元测试方法执行前都执行一遍

  • @BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次)

  • @DisplayName("商品入库测试"):用于指定单元测试的名称

  • @Disabled:当前单元测试置为无效,即单元测试时跳过该测试

  • @RepeatedTest(n):重复性测试,即执行n次

  • @ParameterizedTest:参数化测试,

  • @ValueSource(ints = {1, 2, 3}):参数化测试提供数据

断言

JUnit Jupiter提供了强大的断言方法用以验证结果,在使用时需要借助java8的新特性lambda表达式,均是来自org.junit.jupiter.api.Assertions包的static方法。

assertTrue`与`assertFalse`用来判断条件是否为`true`或`false
@Test
@DisplayName("测试断言equals")
void testEquals() {assertTrue(3 < 4);
}

assertNullassertNotNull用来判断条件是否为·null

@Test
@DisplayName("测试断言NotNull")
void testNotNull() {assertNotNull(new Object());
}

assertThrows用来判断执行抛出的异常是否符合预期,并可以使用异常类型接收返回值进行其他操作

@Test
@DisplayName("测试断言抛异常")
void testThrows() {ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> {int m = 5/0;});assertEquals("/ by zero", arithExcep.getMessage());
}

assertTimeout用来判断执行过程是否超时

@Test
@DisplayName("测试断言超时")
void testTimeOut() {String actualResult = assertTimeout(ofSeconds(2), () -> {Thread.sleep(1000);return "a result";});System.out.println(actualResult);
}

assertAll是组合断言,当它内部所有断言正确执行完才算通过。Spring Boot 系列面试题和答案我都整理好了,关注公众号互联网架构师,回复:2T,可以免费获取。

@Test
@DisplayName("测试组合断言")
void testAll() {assertAll("测试item商品下单",() -> {//模拟用户余额扣减assertTrue(1 < 2, "余额不足");},() -> {//模拟item数据库扣减库存assertTrue(3 < 4);},() -> {//模拟交易流水落库assertNotNull(new Object());});
}

重复性测试

在许多场景中我们需要对同一个接口方法进行重复测试,例如对幂等性接口的测试。

JUnit Jupiter通过使用@RepeatedTest(n)指定需要重复的次数

@RepeatedTest(3)
@DisplayName("重复测试")
void repeatedTest() {System.out.println("调用");
}

参数化测试

参数化测试可以按照多个参数分别运行多次单元测试这里有点类似于重复性测试,只不过每次运行传入的参数不用。需

要使用到@ParameterizedTest,同时也需要@ValueSource提供一组数据,它支持八种基本类型以及String和自定义对象类型,使用极其方便。

@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("参数化测试")
void paramTest(int a) {assertTrue(a > 0 && a < 4);
}

内嵌测试

JUnit5提供了嵌套单元测试的功能,可以更好展示测试类之间的业务逻辑关系,我们通常是一个业务对应一个测试类,有业务关系的类其实可以写在一起。

这样有利于进行测试。而且内联的写法可以大大减少不必要的类,精简项目,防止类爆炸等一系列问题。

@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("Junit5单元测试")
public class MockTest {//....@Nested@DisplayName("内嵌订单测试")class OrderTestClas {@Test@DisplayName("取消订单")void cancelOrder() {int status = -1;System.out.println("取消订单成功,订单状态为:"+status);}}
}

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Spring Boot 系列面试题和答案,非常齐全。

Spring Boot 集成 JUnit5,优雅单元测试!相关推荐

  1. Spring Boot 集成 JUnit5,更优雅单元测试!

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://mp.weixin.qq.com/s/2Kdu-nYLF55Ui9A1-ybgFw 为什么使用JUnit5 J ...

  2. Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46

    一.前言 在前面我们通过以下章节对ShardingSphere的AutoTable 有了基础的了解: Spring Boot集成ShardingSphere分片利器 AutoTable (一)-- 简 ...

  3. Spring Boot集成Swagger导入YApi@无界编程

    接口APi开发现状 现在开发接口都要在类似YApi上写文档,这样方便不同的团队之间协作,同步更新接口,提高效率. 但是如果接口很多,你一个个手工在YApi去录入无疑效率很低. 如果是使用Spring ...

  4. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  5. 6.3 Spring Boot集成mongodb开发

    6.3 Spring Boot集成mongodb开发 本章我们通过SpringBoot集成mongodb,Java,Kotlin开发一个极简社区文章博客系统. 0 mongodb简介 Mongo 的主 ...

  6. springboot(十八):使用Spring Boot集成FastDFS

    上篇文章介绍了如何使用Spring Boot上传文件,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包 ...

  7. Spring Boot集成Hazelcast实现集群与分布式内存缓存

    2019独角兽企业重金招聘Python工程师标准>>> Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展.高性能的分布式内存计算.并通过提供诸 ...

  8. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...

  9. 【Java进阶】Spring Boot集成ES

    目录 spring boot集成ES ElasticSearchConfig 测试文档的基本操作 Elasticsearch Clients 文档 spring boot集成ES Java REST ...

  10. Spring Boot集成Jasypt安全框架

    Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...

最新文章

  1. hashmap 泛型_Java 基础 - 泛型
  2. C API可使用的函数归纳
  3. linux指令 find指令详解
  4. 【UGV】32版UGV原理图
  5. java IO(输入输出) 字节缓冲流
  6. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )
  7. 13 款 JavaScript 模板引擎
  8. update inner join mysql_Mysql update inner join
  9. 【必懂C++】第一个程序当然是HelloWorld呀 01
  10. 生成awr报告时报ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
  11. 住在我隔壁储藏室的大学刚毕业的小夫妻[转载]
  12. POI复制Excel模板并填充数据
  13. GCC、GNU到底啥意思?
  14. 学计算机能考南京哪个大学,这三所南京市高校,适合报考计算机类专业,适合的考生不要错过...
  15. java excel 密码,Java 加密、解密Excel文档
  16. GenXus进行APP开发-全局颜色设计
  17. 2021年中国VR/AR行业市场投融资现状分析:VR/AR技术领域融资实现双增长[图]
  18. 耿丹CS16-2班课堂测试作业汇总
  19. Mac下Smb的使用
  20. 如何建设自己的网站 博客

热门文章

  1. 如何使用Camtasia给视频打码
  2. 搭建Yum服务器及编译安装Httpd实验
  3. 在域控制器上安装Exchange 2003的注意事项
  4. SQL Server 823,824 错误
  5. svm支持向量机分类方法
  6. TMG自动发现功能配置正常,但客户端却检测不到TMG服务器。
  7. 【Vegas原创】VMWare下,Linux挂载、卸载新硬盘的方法
  8. MySQL 8支持文档存储,并带来性能和安全方面的改进
  9. 物流广告收入实现高速增长 国际投行看好京东转型潜力
  10. weiapi2.2 HelpPage自动生成接口说明文档和接口测试功能