6

首先,这不是这个问题的重复。在那里,它被专门要求一个对象。我想为一个容器做这个,特别是一个列表。

所以,我知道我可以在使用时忽略一个字段, usingElementComparatorIgnoringFields() 但这不会进行递归比较。

我知道我可以使用usingRecursiveFieldByFieldElementComparator(). 但这不允许我排除给定的字段。

如何递归比较,忽略一个字段?

4

3 回答 3

5

这将出现在下一个 AssertJ Core 版本中:https ://github.com/joel-costigliola/assertj-core/issues/1002

于 2017-06-23T03:10:44.613 回答
1

同时你可以这样写:

assertThat(actualList)
            .usingElementComparator(recursiveIgnoringComparator("excludedField1", "excludedField2", "excludedField3"))
            .containsExactlyInAnyOrder(expectedList);
}

private Comparator<T> recursiveIgnoringFieldsComparator(String... fieldNames) {
    final Map<String, Comparator<?>> comparatorByPropertyOrField =
            Arrays.stream(fieldNames)
                    .collect(toMap(
                            name -> name,
                            name -> (o1, o2) -> 0
                    ));

    return new RecursiveFieldByFieldComparator(comparatorByPropertyOrField, new TypeComparators());
}
于 2017-11-22T11:12:44.703 回答
0

@Arkadiusz 示例对我不起作用。此外,我在列表方面遇到了递归问题,因此我的解决方案是针对这种情况量身定制的。所以我所做的是(Kotlin 代码):

private fun recursiveListComparatorFactory(vararg ignoreFields: String): Comparator<List<*>> {
    return Comparator { o1, o2 ->
        assertThat(o1).hasSameSizeAs(o2)
        for (i in o1.indices) {
            assertThat(o1[i]).usingComparatorForType(recursiveListComparatorFactory(*ignoreFields), List::class.java).isEqualToIgnoringGivenFields(o2[i], *ignoreFields)
        }
        0 // return
    }
}

然后只需调用:

val ignoreFields = ["id", "version"]
assertThat(o1).usingComparatorForType(recursiveListComparatorFactory(ignoreFields), List::class.java).isEqualToIgnoringGivenFields(o2, ignoreFields)
于 2019-01-21T09:57:54.277 回答