java 是否可以使用FieldByFieldElementComparator从assertJ中排除某些字段?

hc2pp10m  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(156)

如何实现以下目标:

List<Data> streams = new ArrayList<>();
assertThat(streams).usingFieldByFieldElementComparatorIgnoringGivenFields("createdOn").containsOnly(data1, data2);
v6ylcynt

v6ylcynt1#

使用ListAssert.usingElementComparatorIgnoringFields(String... fields),其作用与ListAssert.usingFieldByFieldElementComparator()相同,但允许忽略某些字段/属性:
对除给定字段/属性之外的所有字段/属性使用逐个字段/属性比较
所以你可以这样写:

List<Data> streams = new ArrayList<>();
//...
Assertions.assertThat(streams)
          .usingElementComparatorIgnoringFields("createdOn")
          .containsOnly(data1, data2);
vojdkbi0

vojdkbi02#

如果您(1)拥有data源代码的控制权,并且(2)正在使用Lombok annotations,则可以针对createdOn字段使用@EqualsAndHashCode.Exclude,例如

import lombok.*;

@Data
public class Data {

    @EqualsAndHashCode.Exclude   // will not include this field in the generated equals and hashCode methods.
    private Date createdOn;

    ...
}

这确实简化了测试:

assertThat(streams).containsOnly(data1, data2);

**注意:**如果您确实在Data对象上使用equals()方法作为src/main/java类的一部分,则需要确保其他字段的值足以使对象唯一,以便在使用@EqualsAndHashCode.Excludeequals()正常工作。

相关问题