Search code examples
javaassertj

AssertJ: Best way for matching collection of objects against to the collection of conditions/assertions


I am looking for a convenient way of matching list of objects to list of conditions or assertions in a way that all records could be in any order, but all of them should match to all specified conditions. Specific object to specific condition.

Example:

I have list of objects, that could be fetched in arbitrary order. Let's say of the following type:

class Person {
    String name;
    Integer age;
}
Person A is Bobby, 34y
Person B is John, 15y 

And I have list of conditions that I expect to match.

Condition personA = new Condition<>(p -> p.name.equals("Bobby"), "Person A");
Condition personB = new Condition<>(p -> p.name.equals("john"), "Person B");

And now I would like to have some operator that will take a list of persons, and match each person to list of conditions. One of condition should pass, otherwise - assertion fail. Order of persons and conditions could be arbitrary.

Is there exists any way how to do this without adding custom implementation?

P.S> I am aware of extracting() method, but think it is not that convenient for comparing complex objects.


Solution

  • You can test that at least one of the conditions personA and personB is met for each one of the elements in the List <Person> personList as follows:

    assertThat( personList ).are( anyOf( personA, personB ) );
    

    See the AssertJ documentation.

    Note the following imports are required:

    import static org.assertj.core.api.Assertions.anyOf;
    import static org.assertj.core.api.Assertions.assertThat;