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


相关文章
|
2月前
|
C语言
C语言函数返回值详解
本文详细解析了C语言中函数返回值的概念与应用。从函数的基本定义入手,深入探讨了不同类型返回值的作用及意义,并提供了实用的编程示例,帮助读者更好地理解和使用函数返回值。通过本文,你将掌握如何有效利用返回值优化代码结构与功能实现。
|
6月前
|
Java 编译器 Android开发
一篇文章讲明白jni中arm64
一篇文章讲明白jni中arm64
91 0
|
7月前
|
XML 安全 网络安全
渗透测试初级面试题
答:.先爆破用户名,再利用被爆破出来的用户名爆破密码;其实有些站点,在登 陆处也会这样提示;所有和数据库有交互的地方都有可能有注入。 如果你看到了这里,那就点个关注+评论呗! 如需资料可私信,回复不及时,请见谅! 网安面经,试题,题库,需要哪个评论区私信
|
7月前
|
Perl
Grafana 系列 - 统一展示 -9-Jaeger 数据源
Grafana 系列 - 统一展示 -9-Jaeger 数据源
|
运维 数据库 双11
双十一特惠|阿里云数据库ACA认证新用户专享5折
阿里云数据库ACA认证,助力广大客户、合作伙伴、开发人员和DBA乘云而上。双十一新用户专享 阿里云数据库ACA认证5折优惠!
927 0
|
Linux
Linux:bc计算根号保留小数
Linux:bc计算根号保留小数
77 0
|
应用服务中间件 Java Spring
Tomcat请求处理流程
Tomcat+Struts1.x默认的ReqeustProcessor的请求处理流程 Tomcat+Struts+Spring2.
650 0
|
9天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179604 21
|
1天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
对话 | ECS如何构筑企业上云的第一道安全防线