当前位置: 首页 > 知识库问答 >
问题:

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

葛阳
2023-03-14

为了单元测试DTO,我想使用AssertJ的递归比较来比较两个对象(DTO和一个实体)-

DTO can't be compared to Entity as Entity does not declare all DTO fields, it lacks these: [dtoFieldA, dtoFieldB, dtoFieldC]

我尝试过以下配置,但运气不佳:

 assertThat(DTO)
    .usingRecursiveComparison(RecursiveComparisonConfiguration.builder()
    .withEqualsForFields(fieldAPRedicate, "dtoFieldA")
    .withEqualsForFields(fieldBPRedicate, "dtoFieldB")
    .withEqualsForFields(fieldCPRedicate, "dtoFieldC")
    .build())
.isEqualTo(Entity)

BiPredicate<DTO, Entity> fieldAPRedicate = (d, e) -> d.dtoFieldA().equals(e.entityFieldA());
BiPredicate<DTO, Entity> fieldBPRedicate = (d, e) -> d.dtoFieldB().equals(e.entityFieldB());
BiPredicate<DTO, Entity> fieldCPRedicate = (d, e) -> d.dtoFieldC().equals(e.entityFieldC());

比较阶级:

DTO:

public class DTO {
   protected String sameNameField1;
   protected String sameNameField2;
   protected String dtoFieldA;
   protected String dtoFieldB;
   protected String dtoFieldC;
}

实体:

public class Entity {
   protected String sameNameField1;
   protected String sameNameField2;
   protected String entityFieldA;
   protected String entityFieldB;
   protected String entityFieldC;
}

在这种情况下,如何配置assertJ?

共有1个答案

尚声
2023-03-14

我认为目前你能做的最好的是忽略字段,因为递归比较中不支持比较不同名称的字段,忽略doc:https://assertj.github.io/doc/#assertj-core-recursive-comparison-ignoring-fields

如果您绝对需要将DTO. a字段与Entity. b字段进行比较,最好的选择是定义一个自定义比较方法,该方法将知道哪个字段与哪个字段进行比较,但在AssertJ中没有什么真正有帮助的(using比较()存在,但泛型类型不允许将您的DTO与实体进行比较,除非您将所有内容都与Object进行比较,但在这一点上,解决方案不再值得)。

 类似资料:
  • 问题内容: 有和。 但是,我无法通过忽略某些字段来递归比较两个对象。根据此讨论,它必须处于开发中。 如何仍然获得我的断言的返回值进行递归比较,但忽略了某些字段。是否可以在任何其他库中使用,或者我可以通过某种方式使用它? 问题答案: 我无法让它忽略某些字段,但通过为要忽略的字段引入比较器并始终将它们评估为true设法设法解决了该问题。这不是流利的,而是完成工作的临时解决方案。 截至2017 年4月1

  • 具有和。 但是,我无法通过忽略某些字段来递归地比较两个对象。根据本文的讨论,它必须处于开发中。

  • 我有两个java对象是从同一个类实例化的。 既然它是同一类型的,那么它不应该执行“if”部分中的语句吗?

  • 我只是实现了自己的插入排序,并试图验证功能,包括稳定性。 对于给定的未排序元素列表,我试图根据collections#sort(list)方法验证我的代码。 我找到了AbstractiterAbleAssert#ContainsExactlYelementsOf方法。 最后,我将方法跟踪到调用的位置。 方法是否覆盖稳定性? 或者,对于是否应该添加其他方法?

  • 我想写一个泛型函数,接受同一实体类的两个对象,比较不同的字段,并返回对特定字段所做的所有更改的列表。 然后调用上面的函数比较entity_audit表中的每一对记录。代码将非常大,以比较每个字段,并乘以不同的实体。有没有更好更高效的办法?

  • 问题内容: 我如何测试python中两个JSON对象是否相等,而忽略列表的顺序? 例如 … JSON文档a: JSON文档b: 并且应该比较相等,即使列表的顺序不同。 问题答案: 如果你想要两个具有相同元素但顺序不同的对象相等,那么显而易见的事情是比较它们的排序后的副本-例如,以JSON字符串和表示的字典: …但这是行不通的,因为在每种情况下,”errors”顶层dict的项都是具有相同元素的列表