【问题标题】:How to compare recursively ignoring given fields using assertJ?如何使用assertJ递归地比较忽略给定字段?
【发布时间】:2017-09-05 01:58:06
【问题描述】:

AssertJisEqualToIgnoringGivenFieldsisEqualToComparingFieldByFieldRecursively

但是,我无法通过忽略某些字段来递归地比较两个对象。根据this 的讨论,它必须正在开发中。

如何仍然让我的断言返回值进行递归比较,但忽略某些字段。是否可以在任何其他库中使用,或者我可以使用AssertJ 以某种方式做到这一点?

【问题讨论】:

    标签: java unit-testing assertj


    【解决方案1】:

    使用 AssertJ 版本 3.12.0 中的最新“递归比较 api 改进” 现在可以进行递归比较并忽略字段:

    Assertions.assertThat(objActual)
                    .usingRecursiveComparison()
                    .ignoringFields("uniqueId", "otherId")
                    .ignoringFieldsMatchingRegexes(".*someId")
                    .ignoringOverriddenEqualsForTypes(MyData.class, MyDataItem.class)
                    .isEqualTo(objExpected);
    

    【讨论】:

    • 我将我的答案标记为已接受,因为当我遇到特定版本的问题时,我使用这种方式解决了它。但是,我建议任何新来者检查这个特定的答案,因为最好使用更新的版本。
    【解决方案2】:

    我无法让它忽略某些字段,但我设法通过为我想忽略的字段引入一个比较器来暂时解决它,并始终将它们评估为真。这不是流利的,而是完成工作的临时解决方案。

    assertThat(object).usingComparatorForFields((x,y)->0,"field1","field2").isEqualToComparingFieldByFieldRecursively(expectedObject);
    

    截至 2017 年 4 月 13 日,这有一个 issueIt doesn't work 当比较器尝试比较的字段为空时。当对象之一是 null 时,这是一个问题,如果两者都是 null,则不是。

    【讨论】:

    • 我将我的答案标记为已接受,因为当我遇到特定版本的问题时,我使用这种方式解决了它。但是,我建议任何新来者检查Ovidiu Nistor's answer,因为最好使用更新版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2011-10-06
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多