一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java中 AssertJ assertThat(List) 泛型断言怎么进行元素属性断言

时间:2026-07-14 09:36:02 编辑:袖梨 来源:一聚教程网

AssertJ 对 List 元素属性断言的核心是 extracting 方法,支持字段/方法提取、嵌套属性、多属性元组;配合 asList() 或 as(InstanceOfAssertFactory) 实现类型安全断言;可通过 filteredOn 先筛选后提取;亦支持 Function 自定义提取逻辑。

AssertJ 对 List 进行元素属性断言,核心是用 extracting 提取属性,再链式断言提取结果。不需要手动遍历,也不依赖泛型擦除带来的类型丢失问题——AssertJ 通过反射+泛型推导,在运行时保留足够信息完成类型安全的校验。

用 extracting 提取字段或方法返回值

最常用方式:调用 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)));
  • 若字段是 private 但有 public getter,仍可用 "age"(自动匹配 getAge()

配合 asList() 或 as(InstanceOfAssertFactory) 做类型安全断言

单纯 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);

用 filteredOn + extracting 组合做条件筛选后断言

先按条件过滤元素,再提取属性断言,避免全量遍历。适合验证“满足某条件的元素,其某属性应等于什么”。

立即学习“Java免费学习笔记(深入)”;

  • assertThat(users).filteredOn("active", true).extracting("role").containsOnly("USER", "ADMIN");
  • assertThat(products).filteredOn(p -> p.getPrice().compareTo(BigDecimal.ZERO) > 0).extracting("name").doesNotContainNull();

自定义提取逻辑:用 Function 替代字符串路径

当属性名动态、含计算逻辑,或需处理 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);

热门栏目