如何使用AssertJ断言校验Java枚举值及其对应字段
基于AssertJ的简洁枚举测试实现
你原有的写法需要手动维护预期映射表,用AssertJ内置的集合提取断言可以大幅简化代码,完全覆盖两项校验要求,还能避免冗余代码。
核心实现代码
注意你原有测试代码里的枚举名PaymentType和定义的PaymentMethod不一致,以下代码统一使用正确的枚举名:
import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; class PaymentMethodTest { @Test void should_match_all_enum_definitions() { // 1. 先校验枚举总数量和预期一致,防止后续新增枚举值漏测 assertThat(PaymentMethod.values()).hasSize(4); // 2. 严格校验每个枚举项的id和定义完全匹配 // containsExactly会同时校验值的顺序、内容完全一致,缺项、错值、顺序错都会触发断言失败 assertThat(PaymentMethod.values()) .extracting(PaymentMethod::getId, Long.class) .containsExactly(1L, 2L, 3L, 4L); } // 如需单独校验指定id对应枚举存在性,可补充该用例 @Test void should_match_correct_enum_for_each_id() { assertThat(PaymentMethod.CREDITCARD.getId()).isEqualTo(1L); assertThat(PaymentMethod.PAYPAL.getId()).isEqualTo(2L); assertThat(PaymentMethod.APPLE_PAY.getId()).isEqualTo(3L); assertThat(PaymentMethod.GOOGLE_PAY.getId()).isEqualTo(4L); } }
校验逻辑说明
这套写法完全覆盖你需要的两项校验规则:
- 枚举存在性校验:
PaymentMethod.values()会返回所有定义的枚举实例,hasSize和containsExactly组合校验时,只要缺失任意一个预期枚举值,断言会直接失败 - 关联字段匹配校验:
extracting(PaymentMethod::getId)会提取所有枚举实例的id字段,和传入的预期值列表做严格匹配,只要任意一个id和预期不符就会报错
如果需要模拟业务中「根据id查找对应枚举」的场景,还可以加过滤断言,避免出现id重复、id对应枚举错误的问题:
@Test void should_map_id_to_correct_enum_instance() { assertThat(PaymentMethod.values()) .filteredOn(pm -> pm.getId() == 1L) .containsExactly(PaymentMethod.CREDITCARD); assertThat(PaymentMethod.values()) .filteredOn(pm -> pm.getId() == 2L) .containsExactly(PaymentMethod.PAYPAL); assertThat(PaymentMethod.values()) .filteredOn(pm -> pm.getId() == 3L) .containsExactly(PaymentMethod.APPLE_PAY); assertThat(PaymentMethod.values()) .filteredOn(pm -> pm.getId() == 4L) .containsExactly(PaymentMethod.GOOGLE_PAY); }
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

