AssertJ:无需Condition如何实现任意值的多值匹配校验
关于AssertJ多值任意匹配校验的解决方案
嗨,Manuel!你提到的需求——校验属性值是否为指定多个值中的任意一个,其实AssertJ有几个比Condition<T>的anyOf()更简洁的实现方式,而且完全支持String、Integer等任意数据类型,下面给你详细说说:
1. 直接使用isIn()方法(最推荐)
这是AssertJ专门为“值在指定集合/数组中”场景设计的校验方法,用法直观,不需要额外定义Condition,完全适配各种数据类型。
示例代码:
// 校验String类型值是否为"a"或"b" String targetStr = "a"; Assertions.assertThat(targetStr).isIn("a", "b"); // 校验Integer类型值是否为77或88 Integer targetInt = 88; Assertions.assertThat(targetInt).isIn(77, 88); // 也可以传入集合形式的候选值 Assertions.assertThat(targetInt).isIn(Arrays.asList(77, 88));
2. 针对对象属性的链式校验
如果需要校验某个对象的属性值是否符合多值匹配,可以结合extracting()和isIn()实现链式校验,写法同样简洁清晰:
示例代码:
// 假设我们有一个User类,包含username(String)和age(Integer)属性 User user = new User("alice", 88); // 分别校验每个属性的多值匹配 Assertions.assertThat(user) .extracting(User::getUsername).isIn("alice", "bob") .extracting(User::getAge).isIn(77, 88);
关于anyOf()的补充
你提到anyOf()似乎只能通过Condition<T>实现,其实这个方法的定位是组合多个独立校验条件(比如同时满足“不为空”和“长度大于3”这类复合场景),而针对“值在指定集合中”的单一需求,isIn()是更贴合语义、写法更简洁的选择。
这些方法都支持所有可比较的数据类型,只要目标值和候选值类型一致,就能正常工作~
内容的提问来源于stack exchange,提问作者Manuel Jordan
相关产品推荐
相关产品推荐

