AssertJ的介绍

简介: 根据《单元测试的艺术》一书中的观点,一个良好的单元测试包括三个步骤: 准备测试环境和数据; 执行目标方法; 验证执行结果(判断程序的运行结果是否如你所想)。 我们一般使用断言(Assert)进行结果验证,Junit的org.junit.Assert包提供了大量断言API,如:assertEq

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

  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

文/杜琪(简书作者)
原文链接:http://www.jianshu.com/p/756049988d61
目录
相关文章
|
缓存 NoSQL Java
Spring Cache 缓存原理与 Redis 实践
Spring Cache 缓存原理与 Redis 实践
861 0
|
存储 缓存 NoSQL
快速入门:Spring Cache
快速入门:Spring Cache
500 0
|
存储 缓存 Java
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
|
Java 关系型数据库 MySQL
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
IDEA(Community版)数据库插件Database Navigator的安装与使用教程
|
9月前
|
存储 Linux iOS开发
Elasticsearch Enterprise 8.19.10 (macOS, Linux, Windows) - 分布式搜索和分析引擎
Elasticsearch Enterprise 8.19.10 (macOS, Linux, Windows) - 分布式搜索和分析引擎
345 0
|
机器学习/深度学习 传感器 文字识别
传统OCR与深度学习OCR的较量
OCR(光学字符识别)技术经历了从传统手工特征提取到深度学习自动化处理的变革。本文对比传统OCR与深度学习OCR,从图像预处理到后处理,详解技术演进带来的速度、精度与扩展性飞跃。
674 0
|
人工智能 自然语言处理 搜索推荐
GLM-Realtime:智谱推出多模态交互AI模型,融入清唱功能,支持视频和语音交互
GLM-Realtime 是智谱推出的端到端多模态模型,具备低延迟的视频理解与语音交互能力,支持清唱功能、2分钟内容记忆及灵活调用外部工具,适用于多种智能场景。
1213 4
GLM-Realtime:智谱推出多模态交互AI模型,融入清唱功能,支持视频和语音交互
IDEA SVN提交设置忽略文件
IDEA SVN提交设置忽略文件
1184 117
|
数据库 微服务
SEATA模式
Seata 是一款开源的分布式事务解决方案,支持多种事务模式以适应不同的应用场景。其主要模式包括:AT(TCC)模式,事务分三阶段执行;TCC 模式,提供更灵活的事务控制;SAGA 模式,基于状态机实现跨服务的事务一致性;XA 模式,采用传统两阶段提交协议确保数据一致性。
591 5
|
运维 监控 安全
2024除了宝塔面板还有哪些好用的服务器管理软件
2024年,服务器管理软件市场百花齐放,本文介绍Websoft9、cPanel和Orion-Ops三款软件,分别在开源应用部署、Web主机管理和自动化运维方面表现出色,为用户提供更多选择。
1087 0