AssertJ的介绍

简介:

根据《单元测试的艺术》一书中的观点,一个良好的单元测试包括三个步骤:

  1. 准备测试环境和数据;
  2. 执行目标方法;
  3. 验证执行结果(判断程序的运行结果是否如你所想)。

我们一般使用断言(Assert)进行结果验证,Junit的org.junit.Assert包提供了大量断言API,如:assertEquals、assertTrue和assertNotNull等等。总体来说,Junit的断言API还可以,功能不算强大,只能说是满足需求。

接下来介绍下本文的主角:AssertJ。AssertJ的slogan是:Fluent assertions for java。如果读者了解构建链模式或者Java 8的stream&filter,那么就可以体会到这种思路的好处了。

接下来看看官网给出的例子(确实比Junit强大很多):

// unique entry point to get access to all assertThat methods and utility methods (e.g. entry)
import static org.assertj.core.api.Assertions.*;

// in the following examples, fellowshipOfTheRing is a List of [TolkienCharacter](https://github.com/joel-costigliola/assertj-examples/blob/java-8/assertions-examples/src/main/java/org/assertj/examples/data/TolkienCharacter.java)

// basic assertions
assertThat(frodo.getName()).isEqualTo("Frodo");
assertThat(frodo).isNotEqualTo(sauron)
                 .isIn(fellowshipOfTheRing);

// String specific assertions
assertThat(frodo.getName()).startsWith("Fro") 
                           .endsWith("do") 
                           .isEqualToIgnoringCase("frodo");

// collection specific assertions
assertThat(fellowshipOfTheRing).hasSize(9) 
                               .contains(frodo, sam)
                               .doesNotContain(sauron);

// Java 8 exception assertion
assertThatThrownBy(() -> { throw new Exception("boom!"); }).isInstanceOf(Exception.class)
                                                           .hasMessageContaining("boom");

// Java 8 BDD style exception
 assertion Throwable thrown = catchThrowable(() -> { throw new Exception("boom!"); });

assertThat(thrown).isInstanceOf(Exception.class) 
                  .hasMessageContaining("boom");

// using extracting magical feature to check fellowshipOfTheRing characters name :)
assertThat(fellowshipOfTheRing).extracting("name")
                               .contains("Boromir", "Gandalf", "Frodo", "Legolas")
                               .doesNotContain("Sauron", "Elrond");

// Extracting with Java 8 love (type safe)
assertThat(fellowshipOfTheRing).extracting(TolkienCharacter::getName) 
                               .contains("Boromir", "Gandalf", "Frodo", "Legolas")
                               .doesNotContain("Sauron", "Elrond");

// Extracting multiple values at once (using tuple to group them)
assertThat(fellowshipOfTheRing).extracting("name", "age", "race.name")
                               .contains(tuple("Boromir", 37, "Man"),
                                                 tuple("Sam", 38, "Hobbit"),
                                                 tuple("Legolas", 1000, "Elf"));

// filter collection before 
assertionassertThat(fellowshipOfTheRing).filteredOn("race", HOBBIT)
                                        .containsOnly(sam, frodo, pippin, merry);

// filter collection with Java 8 
PredicateassertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o"))
                                        .containsOnly(aragorn, frodo, legolas, boromir);

// combining filtering and extraction (yes we can)
assertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o"))
                               .containsOnly(aragorn, frodo, legolas, boromir)
                               .extracting(character -> character.getRace().getName())
                               .contains("Hobbit", "Elf", "Man");

// and many more assertions : map, dates (java 7 and java 8), file, numbers, optional ...

参考资料

  1. AssertJ Core latest news
  2. JUnit 单元测试断言推荐 AssertJ


目录
相关文章
|
11月前
|
JavaScript 前端开发 API
尚硅谷Vue3 笔记总结及代码-1
尚硅谷Vue3 笔记总结及代码-1
300 0
|
索引 流计算 消息中间件
Flink 实时写入数据到 ElasticSearch 性能调优
线上业务反应使用 Flink 消费上游 kafka topic 里的轨迹数据出现 backpressure,数据积压严重。单次 bulk 的写入量为:3000/50mb/30s,并行度为 48。针对该问题,为了避免影响线上业务申请了一个与线上集群配置相同的 ES 集群。
|
10月前
|
Java Maven
Maven打包所有依赖
Maven打包所有依赖
117 0
|
10月前
|
数据采集 调度 监控
带你读《构建企业级好数据(Dataphin智能数据建设与治理白皮书)》——3. 研发:高效建设,稳定运行
带你读《构建企业级好数据(Dataphin智能数据建设与治理白皮书)》——3. 研发:高效建设,稳定运行
269 0
|
存储 搜索推荐 测试技术
数据结构__<八大排序> __插入排序 |希尔排序 |选择排序 |堆排序 |快速排序 |归并排序(C语言实现)
数据结构__<八大排序> __插入排序 |希尔排序 |选择排序 |堆排序 |快速排序 |归并排序(C语言实现)
264 0
|
存储 数据可视化 数据库
Grafana数据可视化工具安装与应用
关键词:Grafana、Elasticsearch、Table、Gauge、BarGrauge、Graph、PieChart、Variables。
5396 0
Grafana数据可视化工具安装与应用
|
运维 数据库 双11
双十一特惠|阿里云数据库ACA认证新用户专享5折
阿里云数据库ACA认证,助力广大客户、合作伙伴、开发人员和DBA乘云而上。双十一新用户专享 阿里云数据库ACA认证5折优惠!
899 0
双十一特惠|阿里云数据库ACA认证新用户专享5折
|
SQL 存储 分布式计算
DataX 从HDFS文件系统上读取数据到FTP文件服务器 【举例介绍】
DataX 从HDFS文件系统上读取数据到FTP文件服务器 【举例介绍】
1227 0
DataX 从HDFS文件系统上读取数据到FTP文件服务器 【举例介绍】
|
算法
算法竞赛题目解析:文字处理软件
算法竞赛题目解析:文字处理软件
215 0
|
Linux
把当前目录文件名输出到一个文件
linux ls > filename.txt --打印当前目录及子目录所有文件 find "$PWD" > print.txt window dos dir > filename.txt --打印当前目录及子目录所有文件 dir /s /b > print.
1165 0