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


相关文章
|
8月前
|
机器学习/深度学习
精确率和召回率
精确率和召回率
383 2
|
4月前
|
C语言
C语言函数返回值详解
本文详细解析了C语言中函数返回值的概念与应用。从函数的基本定义入手,深入探讨了不同类型返回值的作用及意义,并提供了实用的编程示例,帮助读者更好地理解和使用函数返回值。通过本文,你将掌握如何有效利用返回值优化代码结构与功能实现。
|
8月前
|
Java 编译器 Android开发
一篇文章讲明白jni中arm64
一篇文章讲明白jni中arm64
115 0
|
9月前
|
XML 安全 网络安全
渗透测试初级面试题
答:.先爆破用户名,再利用被爆破出来的用户名爆破密码;其实有些站点,在登 陆处也会这样提示;所有和数据库有交互的地方都有可能有注入。 如果你看到了这里,那就点个关注+评论呗! 如需资料可私信,回复不及时,请见谅! 网安面经,试题,题库,需要哪个评论区私信
|
9月前
|
Perl
Grafana 系列 - 统一展示 -9-Jaeger 数据源
Grafana 系列 - 统一展示 -9-Jaeger 数据源
|
运维 数据库 双11
双十一特惠|阿里云数据库ACA认证新用户专享5折
阿里云数据库ACA认证,助力广大客户、合作伙伴、开发人员和DBA乘云而上。双十一新用户专享 阿里云数据库ACA认证5折优惠!
936 0
|
Linux
Linux:bc计算根号保留小数
Linux:bc计算根号保留小数
87 0
|
应用服务中间件 Java Spring
Tomcat请求处理流程
Tomcat+Struts1.x默认的ReqeustProcessor的请求处理流程 Tomcat+Struts+Spring2.
658 0
|
2天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
98009 23
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。