Random
Random

Reputation: 345

assertj / Java comparing objects with list field ignoring order of elements in list

I am looking to compare 2 list of objects (say Foo) in test.

List<Foo> fooA;
List<Foo> fooB;

Each Foo entry has one of the fields of type List (say Bar)

class Foo {
  private List<Bar> bars;
  ....
}

assertThat(fooA).isEqualTo(fooB);

Comparison fails because elements of bars are same but in different order.

Is there a way to compare them ignoring order?

I am not looking for below option.

assertThat(fooA).usingElementComparatorIgnoringFields("bars").isEqualTo(fooB);

Ideally I would like to compare all the fields

Upvotes: 13

Views: 18106

Answers (2)

alampada
alampada

Reputation: 2409

you can do this with assertJ:

assertThat(fooA).usingRecursiveComparison().ignoringCollectionOrder().isEqualTo(fooB)

Upvotes: 14

davidxxx
davidxxx

Reputation: 131346

What you are looking for is containsExactlyInAnyOrderElementsOf(Iterable) defined in IterableAssert (emphasis is mine) :

Verifies that the actual group contains exactly the given values and nothing else, in any order.

You could write so :

List<Foo> fooA;
List<Foo> fooB;
//...
assertThat(fooA).containsExactlyInAnyOrderElementsOf(fooB);

Upvotes: 3

Related Questions