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
目录
相关文章
|
人工智能 机器人 测试技术
使用LM Studio在本地运行LLM完整教程
GPT-4被普遍认为是最好的生成式AI聊天机器人,但开源模型一直在变得越来越好,并且通过微调在某些特定领域是可以超过GPT4的。
7070 1
|
8月前
|
机器学习/深度学习 传感器 文字识别
传统OCR与深度学习OCR的较量
OCR(光学字符识别)技术经历了从传统手工特征提取到深度学习自动化处理的变革。本文对比传统OCR与深度学习OCR,从图像预处理到后处理,详解技术演进带来的速度、精度与扩展性飞跃。
331 0
|
人工智能 自然语言处理 搜索推荐
GLM-Realtime:智谱推出多模态交互AI模型,融入清唱功能,支持视频和语音交互
GLM-Realtime 是智谱推出的端到端多模态模型,具备低延迟的视频理解与语音交互能力,支持清唱功能、2分钟内容记忆及灵活调用外部工具,适用于多种智能场景。
696 4
GLM-Realtime:智谱推出多模态交互AI模型,融入清唱功能,支持视频和语音交互
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
10427 2
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
|
存储 程序员 C语言
堆和栈之间有什么区别
【9月更文挑战第1天】堆和栈之间有什么区别
3360 0
|
消息中间件 Kafka Linux
安装Kafka3.0
消息队列是当前分布式系统中不可或缺的一部分了,今天先简单学习一下安装吧。
613 0
|
存储 固态存储 安全
服务器硬件基础知识
服务器硬件基础知识
1298 1
|
运维 监控 安全
2024除了宝塔面板还有哪些好用的服务器管理软件
2024年,服务器管理软件市场百花齐放,本文介绍Websoft9、cPanel和Orion-Ops三款软件,分别在开源应用部署、Web主机管理和自动化运维方面表现出色,为用户提供更多选择。
IDEA之Stream表达式生成、调试
IDEA之Stream表达式生成、调试
631 1

热门文章

最新文章