使用 AssertJ 比较具有特定字段的“特殊”断言的两个对象

罗伯特·布什

鉴于以下课程...

public class UserAccount {
  private Long id;
  private String email;
  private String activationCode;
  private Date createDate;
}

...我需要使用 AssertJ 将实际对象与预期对象进行比较。然而领域idactivationCodecreateDate有动态值,我不能硬编码到断言。

所以下面的断言会失败:
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用AssertJ递归比较具有不同字段名称但具有相同值的两个对象

使用AssertJ声明列表中的单个对象

如何使用assertJ比较递归地忽略给定字段的列表?

如何比较递归忽略使用assertJ给出领域?

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

信任断言库与AssertJ的比较

在 AssertJ isequaltoignoringgivenfields 中使用什么?

有没有办法在Spring MVC Test中使用AssertJ断言?

assertj 断言 assertThat 未解决

AssertJ JUnitSoftAssertions 和 Guava 断言

AssertJ对原因消息进行断言

AssertJ 如何通过元素值比较两个列表?

使用 AssertJ 进行测试时从实际和预期对象中提取字段

使用AssertJ在同一对象上声明多个JsonNode路径?

声明列表仅包含使用AssertJ的类的一个实例

使用来自Cucumber的AssertJ Swing测试

我无法使用 AssertJ 测试 Swing GUI

使用AssertJ在测试中获取JSlider值

使用两个具有相同特征的分解对象断言 True

在AssertJ断言中设置的乘法条件?

AssertJ库是否有Kotlin等效项?

Junit测试具有最终属性的对象创建(AssertJ)

使用java流比较两个带有字段的对象列表

比较两个Unicode字符串时AssertJ错误失败

使用 F# 反射比较具有默认 IComparable 实现的两个对象

AssertJ 断言在 Selenium 上没有按预期工作

比较两个使用断言转换为对象的json列表

Springboot jpa,使用两个连接获取具有特定字段的行

如何开始:使用AssertJ Swing测试Java Swing GUI