如何使用 assertJ 递归地比较忽略给定字段的列表?
How to compare LISTS recursively ignoring given fields using assertJ?
首先,这不是 的副本。在那里,它被专门要求一个对象。我想为一个 Container 做这个,特别是一个 List。
所以,我知道我可以在使用时忽略一个字段
usingElementComparatorIgnoringFields()
但这不会进行递归比较。
我知道我可以使用 usingRecursiveFieldByFieldElementComparator()
。但这不允许我排除给定的字段。
如何递归比较,忽略一个字段?
这将在下一个 AssertJ Core 版本中:https://github.com/joel-costigliola/assertj-core/issues/1002
同时你可以这样写:
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());
}
@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)
首先,这不是
所以,我知道我可以在使用时忽略一个字段
usingElementComparatorIgnoringFields()
但这不会进行递归比较。
我知道我可以使用 usingRecursiveFieldByFieldElementComparator()
。但这不允许我排除给定的字段。
如何递归比较,忽略一个字段?
这将在下一个 AssertJ Core 版本中:https://github.com/joel-costigliola/assertj-core/issues/1002
同时你可以这样写:
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());
}
@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)