assertj 提供丰富 map 断言:基础结构断言(大小、键值存在性)、全量内容比对(containsexactlyentriesof)、嵌套结构链式断言(extracting+asinstanceof)、自定义过滤断言(filteredon+allsatisfy),语义清晰、可读性强。

AssertJ 对 Map 的断言支持非常丰富,能清晰表达“结构是否符合预期”,避免手写冗长的 if 判断或嵌套 assertThat(map.get("key")).isEqualTo(...)。
断言 Map 的基本结构(大小、是否为空、是否包含键/值)
这是最常用的一类断言,语义明确,代码可读性高:
- assertThat(map).isNotEmpty().hasSize(3) —— 同时验证非空和元素数量
- assertThat(map).containsKeys("name", "age") —— 断言必须包含指定键(不关心其他键)
- assertThat(map).containsEntry("status", "active") —— 断言存在精确的 key-value 对
- assertThat(map).doesNotContainKey("deletedAt") —— 明确排除某个键
断言 Map 的整体内容(精确匹配键值对)
用 containsExactlyEntriesOf() 或 containsExactly() 实现全量比对,适合校验 DTO 序列化、配置映射等场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- assertThat(map).containsExactlyEntriesOf(Map.of("id", 101, "type", "user"))
- 或者用静态构造:assertThat(map).containsExactly(entry("id", 101), entry("type", "user"))
- 注意:
containsExactly要求键值对顺序与 map 迭代顺序一致(Java 8+ HashMap 迭代无序,推荐用containsExactlyEntriesOf或使用LinkedHashMap测试)
断言嵌套 Map 或复杂结构(如 Map)
当 value 是 Map、List 或自定义对象时,可链式深入断言:
- assertThat(map).extracting("metadata").asInstanceOf(MAP).containsEntry("version", "2.1")
- assertThat(map).extracting("items").asInstanceOf(LIST).element(0).extracting("price").isEqualTo(new BigDecimal("99.9"))
- 搭配
asInstanceOf()显式类型转换,避免泛型擦除导致的编译错误或运行时异常
自定义结构断言(比如只关心某些字段是否为 null 或非空)
用 filteredOn() + extracting() 快速聚焦关键字段:
- assertThat(map).filteredOnValues(Objects::nonNull).hasSize(2) —— 断言有且仅有 2 个非 null 值
- assertThat(map).filteredOnKeys(k -> k.startsWith("config_")).containsOnlyKeys("config_timeout", "config_retry")
- 配合
allSatisfy()可对每个 entry 执行自定义逻辑:entry -> assertThat(entry.getValue()).isInstanceOf(String.class)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










