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

Tar*_*nti 5 java unit-testing assertj

AssertJisEqualToIgnoringGivenFieldsisEqualToComparingFieldByFieldRecursively.

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

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

小智 10

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

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

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

Rob*_*rtG 9

不知道这是否是您的确切问题,但过去常常让我困惑的是,对于忽略字段函数,“导航”到要忽略的字段并不考虑数组/可迭代边界。

也就是说,如果我有一本有很多页的课本(例如,如果您有一对多关系并将其保存到关系数据库中),我可以忽略“book.pages”是一个数组的事实,并且只需使用“book.pages.id”,就像一直只有一页一样,如下所示:

assertThat(actualBook)
    .usingRecursiveComparison()
    .ignoringFields("id", "pages.id", "pages.book")
    .isEqualTo(expectedBook);
Run Code Online (Sandbox Code Playgroud)

为什么这令人困惑?因为如果您忘记忽略字段,则异常将表明“pages[2].id”中存在不匹配 - 但您在忽略语句中不需要该索引“[2]”。


Tar*_*nti 8

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

assertThat(object).usingComparatorForFields((x,y)->0,"field1","field2").isEqualToComparingFieldByFieldRecursively(expectedObject);
Run Code Online (Sandbox Code Playgroud)

这在2017 4月13日有一个问题.当比较器试图比较的字段为空时,它不起作用.当其中一个对象null不同时,这是一个问题null.