Как сравнить СПИСКИ, рекурсивно игнорируя заданные поля, используя assertJ?

Во-первых, это не дубликат этого вопроса . Там его спрашивают конкретно об объекте. Я хочу сделать это для контейнера, в частности для списка.

Итак, я знаю, что могу игнорировать поле при использовании usingElementComparatorIgnoringFields() Но это не будет выполнять рекурсивное сравнение.

Я знаю, что могу использовать usingRecursiveFieldByFieldElementComparator(). Но это не позволит мне исключить данное поле.

Как я могу сравнивать рекурсивно, игнорируя поле?


person orrymr    schedule 22.06.2017    source источник


Ответы (3)


это будет в следующей версии AssertJ Core: https://github.com/joel-costigliola/assertj-core/issues/1002

person Joel Costigliola    schedule 23.06.2017

Между тем, вы можете написать это:

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());
}
person Arkadiusz Masiakiewicz    schedule 22.11.2017

Пример @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)
person croc    schedule 21.01.2019