AssertJ技术咨询:使用FieldByFieldElementComparator能否排除字段及实现方法
嘿,这个问题问得很到位!我来给你详细讲讲AssertJ里的字段比较和忽略逻辑:
关于AssertJ中FieldByFieldElementComparator的字段排除及断言实现
1. FieldByFieldElementComparator能否排除部分字段?
当然可以!虽然FieldByFieldElementComparator默认会递归比较对象的所有字段,但AssertJ早就为我们想到了字段排除的需求,提供了现成的便捷方法来实现这一点,不用你手动去修改比较器的核心逻辑。你提到的usingFieldByFieldElementComparatorIgnoringGivenFields就是官方专门封装的、用于忽略指定字段的字段比较器用法。
2. 如何实现你给出的断言需求?
你写的代码其实已经是正确的实现方式了!我来拆解细节,再给个完整的可运行示例帮你理解:
首先假设你的Data实体类结构如下:
import java.time.LocalDateTime; public class Data { private String id; private String content; private LocalDateTime createdOn; // 构造器 public Data(String id, String content, LocalDateTime createdOn) { this.id = id; this.content = content; this.createdOn = createdOn; } // Getter方法(AssertJ需要访问字段值,要么公开字段,要么提供getter) public String getId() { return id; } public String getContent() { return content; } public LocalDateTime getCreatedOn() { return createdOn; } }
然后准备测试数据:
import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; public class AssertJTest { public static void main(String[] args) { // 创建两个Data对象:除了createdOn字段不同,其余字段完全一致 Data data1 = new Data("stream-001", "test content", LocalDateTime.now()); Data data2 = new Data("stream-002", "demo content", LocalDateTime.now().plusMinutes(30)); List<Data> streams = new ArrayList<>(); streams.add(data1); streams.add(data2);
接下来就是你要的断言逻辑,它的作用是:
用「按字段逐一比较,但忽略
createdOn字段」的规则,校验streams列表是否仅包含data1和data2(注意containsOnly不关心元素顺序)
// 你的断言代码,完全可以直接运行 assertThat(streams) .usingFieldByFieldElementComparatorIgnoringGivenFields("createdOn") .containsOnly(data1, data2); } }
额外补充几个实用技巧:
- 如果需要忽略多个字段,直接传入多个字段名参数即可:
.usingFieldByFieldElementComparatorIgnoringGivenFields("createdOn", "updatedOn", "deletedAt") - 如果你觉得方法名太长,AssertJ还提供了更简洁的等价方法
usingElementComparatorIgnoringFields,效果完全一样:assertThat(streams) .usingElementComparatorIgnoringFields("createdOn") .containsOnly(data1, data2); - 要是你想手动构建比较器实例(比如做更复杂的自定义),也可以这样写:
FieldByFieldElementComparator<Data> customComparator = new FieldByFieldElementComparator<>(); // 移除指定字段的比较规则 customComparator.getFieldComparators().remove("createdOn"); assertThat(streams).usingElementComparator(customComparator).containsOnly(data1, data2);
不过这种方式不如官方提供的忽略字段方法简洁,日常开发更推荐用前两种。
内容的提问来源于stack exchange,提问作者Vel Ganesh
相关产品推荐
相关产品推荐

