Search code examples
javajunit4hamcrest

Assert that actual value is in a collection of possible expected values


Is there a way to assert that an actual value equals any of a number of values?

Example:

String original = "...";
Collection<String> permittedTransformations = Set.of("...[1]", "...[2]", "...[3]");
String actual = transform(original);
assertThat(actual, isContainedIn(permittedTransformations));

I can see that I can just swap the arguments around:

assertThat(permittedTransformations, contains(actual));

but that reverses the semantics. I'm not checking if permittedTransformations is correct; I'm checking actual.


Solution

  • You can map the set elements to individual Matcher<String> objects, and combine them with either:

    import static java.util.stream.Collectors.reducing;
    import static org.hamcrest.CoreMatchers.either;
    import static org.hamcrest.CoreMatchers.is;
    
    Collection<String> permittedTransformations = Set.of("...[1]", "...[2]", "...[3]");
    Optional<Matcher<String>> matcher = permittedTransformations.stream()
                                            .map(s -> is(s))
                                            .collect(reducing((m1, m2) -> either(m1).or(m2)));
    assertThat(actual, matcher.get());