文章目录
- AssertJ:让 Java 单元测试的断言写起来像说话
- 1、它解决什么问题
- 2、怎么用
- 3、模块拆分
- 4、和 JUnit 自带断言的区别
- 5、什么时候不该上
AssertJ:让 Java 单元测试的断言写起来像说话
assertj 在 GitHub 上已经拿到 2.8K Star 了。
这个库干一件事:给 Java 单元测试提供一套强类型的流式断言 API。配合 JUnit、TestNG 或者任何测试框架都能用。
1、它解决什么问题
写过 Java 单元测试的人都遇到过这种写法:
assertEquals("hello",actual);assertTrue(list.contains("a"));assertNotNull(result);断言一多,代码可读性就拉胯,断言失败时报错信息也不够直观。还有类型问题,把Integer和String拿来比较,编译器也帮你拦不住。
AssertJ 的思路是:断言就该针对类型来设计。检查 String 就用 String 的断言,检查 Map 就用 Map 的断言,断言方法直接挂在该类型对应的 assertThat 上。失败信息里把实际值和期望值都打出来,看一眼就知道差在哪。
2、怎么用
入口就一个:assertThat(underTest).,敲完点号之后 IDE 自动补全,把这个对象能用的断言方法全列出来。
assertThat(name).isEqualTo("hello");assertThat(list).containsExactly("a","b","c");assertThat(map).containsKey("key");assertThat(string).startsWith("foo").hasSize(8);链式调用是这个库的核心玩法。一个断言接一个断言往后串,写到一行里读起来像自然语言。失败时会输出完整断言链的上下文,方便定位问题。
3、模块拆分
AssertJ 不是一坨大而全的库,按数据源拆成了几个模块:
- 核心模块:覆盖 JDK 自带类型,String、Iterable、Stream、Path、File、Map 这些都有对应断言
- Guava 模块:给 Guava 的 Multimap、Optional 提供断言
- Joda Time 模块:处理 DateTime、LocalDateTime 这类时间类型
- Neo4J 模块:针对图数据库的 Path、Node、Relationship
- DB 模块:面向关系型数据库的 Table、Row、Column
- Swing 模块:给 Swing 界面做功能测试用
绝大多数人只用核心模块,其他模块按需引入就行。
4、和 JUnit 自带断言的区别
JUnit 的assertXXX系列覆盖类型太少,断言失败信息也要自己写。AssertJ 默认的失败信息已经足够详细,链式调用让多个断言可以接在一起,代码量少一半。
5、什么时候不该上
如果项目里就一两个简单 case,用assertEquals就完了,引入新库反而是负担。AssertJ 的价值在断言密集、对象结构复杂时才明显。团队刚开始用的时候会有学习成本,IDE 补全熟悉之后会快很多。
2.8K Star 不算爆款,但 Java 测试断言这个细分领域,它几乎是事实标准。
E 补全熟悉之后会快很多。
2.8K Star 不算爆款,但 Java 测试断言这个细分领域,它几乎是事实标准。