如何使用AssertJ在单元测试中校验Map值中Group对象内的列表
校验方案
以下是几种不同场景下的AssertJ校验写法:
场景1:校验指定key对应Group的players列表
推荐优先给Group类的players字段添加public getter方法,用类型安全的方法引用写法:
// 校验key为'A'的Group中players列表大小为2,且包含预期元素 assertThat(generatedGroups.get('A')) .extracting(Group::getPlayers) .asList() .hasSize(2) .containsExactlyInAnyOrder(playerA, playerB);
如果没有getter方法,可以用字段名提取:
assertThat(generatedGroups.get('A')) .extracting("players") .asList() .hasSize(2) .containsExactlyInAnyOrder(playerA, playerB);
场景2:直接基于Map断言,同时校验key存在性和对应列表
不需要提前取Group对象,直接在Map断言链上完成校验:
assertThat(generatedGroups) .containsKey('A') .extractingByKey('A') .extracting(Group::getPlayers) .asList() .containsExactlyInAnyOrder(playerA, playerB);
场景3:校验所有Group的players合并后的结果
用flatExtracting可以把所有Group的players列表打平成一个大集合做全局校验:
// 校验所有Group的player总数为2,且包含预期的两个元素 assertThat(generatedGroups.values()) .flatExtracting(Group::getPlayers) .hasSize(2) .containsExactlyInAnyOrder(playerA, playerB);
补充说明
- 如果你不需要匹配整个Player对象,只需要校验Player的某个属性,可以再加一层extracting:
// 只校验player的name属性符合预期 assertThat(generatedGroups.get('A').getPlayers()) .extracting(Player::getName) .containsExactlyInAnyOrder("playerA", "playerB");
- 优先使用方法引用而非字符串字段名,编译期就能检查错误,避免运行期才发现字段名拼写错误。
内容的提问来源于stack exchange,提问作者Kauan Mocelin
相关产品推荐
相关产品推荐

