JUnit5学习之三:Assertions类

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

关于《JUnit5学习》系列

《JUnit5学习》系列旨在通过实战提升SpringBoot环境下的单元测试技能,一共八篇文章,链接如下:

基本操作

Assumptions类

Assertions类

按条件执行

标签(Tag)和自定义注解

参数化测试(Parameterized Tests)基础

参数化测试(Parameterized Tests)进阶

综合进阶(终篇)

本篇概览

本文是《JUnit5学习》系列的第三篇,主要是学习Assertions类(org.junit.jupiter.api.Assertions),Assertions类的一系列静态方法给我们提供了单元测试时常用的断言功能,本篇主要内容如下:

Assertions源码分析

写一段代码,使用Assertions的常用静态方法

使用异常断言

使用超时断言

了解第三方断言库

源码下载

如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示:

名称 链接 备注
项目主页   https://github.com/zq2599/blog_demos   该项目在GitHub上的主页  
git仓库地址(https)   https://github.com/zq2599/blog_demos.git   该项目源码的仓库地址,https协议  
git仓库地址(ssh)   git@github.com:zq2599/blog_demos.git   该项目源码的仓库地址,ssh协议  

这个git项目中有多个文件夹,本章的应用在junitpractice文件夹下,如下图红框所示:

在这里插入图片描述

junitpractice是父子结构的工程,本篇的代码在assertassume子工程中,如下图:

在这里插入图片描述

Assertions源码分析

下图是一段最简单最常见的单元测试代码,也就是Assertions.assertEquals方法,及其执行效果:

在这里插入图片描述

将Assertions.assertEquals方法逐层展开,如下图所示,可见入参expected和actual的值如果不相等,就会在AssertionUtils.fail方法中抛出AssertionFailedError异常:

在这里插入图片描述

用类图工具查看Assertions类的方法,如下图,大部分是与assertEquals方法类似的判断,例如对象是否为空,数组是否相等,判断失败都会抛出AssertionFailedError异常:

在这里插入图片描述


4. 判断两个数组是否相等的逻辑与判断两个对象略有不同,可以重点看看,方法源码如下:

public static void assertArrayEquals(Object[] expected, Object[] actual) { AssertArrayEquals.assertArrayEquals(expected, actual); }

将上述代码逐层展开,在AssertArrayEquals.java中见到了完整的数组比较逻辑,如下图:

在这里插入图片描述

接下来,咱们编写一些单元测试代码,把Assertions类常用的方法都熟悉一遍;

编码实战

打开junitpractice工程的子工程assertassume,新建测试类AssertionsTest.java:

在这里插入图片描述


2. 最简单的判断,两个入参相等就不抛异常(AssertionFailedError):

@Test @DisplayName("最普通的判断") void standardTest() { assertEquals(2, Math.addExact(1, 1)); }

还有另一个assertEquals方法,能接受Supplier类型的入参,当判断不通过时才会调用Supplier.get方法获取字符串作为失败提示消息(如果测试通过则Supplier.get方法不会被执行):

@Test @DisplayName("带失败提示的判断(拼接消息字符串的代码只有判断失败时才执行)") void assertWithLazilyRetrievedMessage() { int expected = 2; int actual = 1; assertEquals(expected, actual, // 这个lambda表达式,只有在expected和actual不相等时才执行 ()->String.format("期望值[%d],实际值[%d]", expected, actual)); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpddjy.html