AssertJ:让 Java 单元测试的断言写起来像说话 文章目录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、RelationshipDB 模块面向关系型数据库的 Table、Row、ColumnSwing 模块给 Swing 界面做功能测试用绝大多数人只用核心模块其他模块按需引入就行。4、和 JUnit 自带断言的区别JUnit 的assertXXX系列覆盖类型太少断言失败信息也要自己写。AssertJ 默认的失败信息已经足够详细链式调用让多个断言可以接在一起代码量少一半。5、什么时候不该上如果项目里就一两个简单 case用assertEquals就完了引入新库反而是负担。AssertJ 的价值在断言密集、对象结构复杂时才明显。团队刚开始用的时候会有学习成本IDE 补全熟悉之后会快很多。2.8K Star 不算爆款但 Java 测试断言这个细分领域它几乎是事实标准。E 补全熟悉之后会快很多。2.8K Star 不算爆款但 Java 测试断言这个细分领域它几乎是事实标准。