鉴于以下课程...
public class UserAccount {
private Long id;
private String email;
private String activationCode;
private Date createDate;
}
...我需要使用 AssertJ 将实际对象与预期对象进行比较。然而领域id
,activationCode
并createDate
有动态值,我不能硬编码到断言。
所以下面的断言会失败:
assertThat(actualUserAccount).isEqualTo(expectedUserAccount);
然后我发现以下内容会忽略某些字段:
assertThat(actualUserAccount)
.usingRecursiveComparison()
.ignoringFields("id", "activationCode", "createDate")
.isEqualTo(expectedUserAccount);
但我实际上正在寻找的是断言对象与某些字段的以下特殊检查相等:
id
什么Long
价值?activationCode
什么String
价值?createDate
什么Date
价值?或者除了为每个字段编写一个断言之外别无他法?
您可以指定如何将某些字段与withEqualsForFields进行比较,以便您可以编写如下内容:
assertThat(actualUserAccount)
.usingRecursiveComparison()
.withEqualsForFields((id1, id2) -> id1 instanceof Long && id2 instanceof Long, "id")
.isEqualTo(expectedUserAccount);
我正在检查两个 ids 字段,因为没有id1
实际 id 和id2
预期 id 的保证。
您还可以编写一个通用方法BiPredicate<A, B> isType(T type)
,它返回一个双谓词,检查两个参数都是 T 类型(我建议的签名可能不起作用,但您明白了),这样您就可以编写:
assertThat(actualUserAccount)
.usingRecursiveComparison()
.withEqualsForFields(isType(Long.class), "id")
.withEqualsForFields(isType(String.class), "activationCode")
.withEqualsForFields(isType(Date.class), "createDate")
.isEqualTo(expectedUserAccount);
这是isType
看起来的样子(不过我还没有测试过):
<A, B, T extends Class<?>> BiPredicate<A, B> isType(T type) {
return (a, b) -> type.isInstance(a) && type.isInstance(b);
}
话虽如此,我可能不会那样做并编写额外的断言。
供参考:https : //assertj.github.io/doc/#assertj-core-recursive-comparison-comparators
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句