You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:15:01