AssertJ 对 List 元素属性断言的核心是 extracting 方法,支持字段/方法提取、嵌套属性、多属性元组;配合 asList() 或 as(InstanceOfAssertFactory) 实现类型安全断言;可通过 filteredOn 先筛选后提取;亦支持 Function 自定义提取逻辑。
AssertJ 对 List 进行元素属性断言,核心是用 extracting 提取属性,再链式断言提取结果。不需要手动遍历,也不依赖泛型擦除带来的类型丢失问题——AssertJ 通过反射+泛型推导,在运行时保留足够信息完成类型安全的校验。
最常用方式:调用 extracting("fieldName") 或 extracting("getMethodName"),AssertJ 自动识别 getter 或公共字段。支持嵌套属性(如 "user.name")和多属性提取(返回元组)。
assertThat(users).extracting("name").contains("Alice", "Bob");assertThat(orders).extracting("customer.id", "amount").contains(tuple(101L, BigDecimal.valueOf(99.9)));"age"(自动匹配 getAge())单纯 extracting 返回的是 Object 列表,若需对提取后的值做进一步类型化断言(比如断言每个 age 是 Integer),可接 asList() 转为 AbstractListAssert,或用 as(InstanceOfAssertFactory) 显式指定类型。
assertThat(users).extracting("age").asList().allSatisfy(age -> assertThat(age).isGreaterThan(0));assertThat(users).extracting("age").as(InstanceOfAssertFactories.INTEGER).allMatch(age -> age > 18);先按条件过滤元素,再提取属性断言,避免全量遍历。适合验证“满足某条件的元素,其某属性应等于什么”。
立即学习“Java免费学习笔记(深入)”;
assertThat(users).filteredOn("active", true).extracting("role").containsOnly("USER", "ADMIN");assertThat(products).filteredOn(p -> p.getPrice().compareTo(BigDecimal.ZERO) > 0).extracting("name").doesNotContainNull();当属性名动态、含计算逻辑,或需处理 null 安全时,传入 lambda 表达式更灵活可靠。
assertThat(users).extracting(user -> user.getProfile().getAvatarUrl()).contains("https://...");assertThat(items).extracting(item -> Optional.ofNullable(item.getTags()).orElse(List.of()).size()).allMatch(size -> size >= 1);