Search code examples
javaselenium-webdrivertestingassertj

AssertJ Java: multiple conditions assertion


is it possible to write in Java AssertJ multi-conditions assertion which will pass if at least one of conditions met? (similar to OR operator)

I want something like this:

assertThat(listOfStrings)
           .satisfiesAnyOf(
                 a -> Assertions.assertThat(listItem).matches(someRegex),
                 // OR
                 b -> Assertions.assertThat(listItem).equals(someString)
            );

Assertion which will receive List of strings and will check each element of list against Regex and equals another string, all elements of list should satisfy at least one of conditions, and in that case - assertion should pass.

Any help greatly appreciated!

Tried a lot of options but none of them works perfectly.


Solution

  • here we are. you can fit contains and matchesRegex methods in variables, as you like !

    package org.example.test;
    
    import org.junit.jupiter.api.Test;
    
    import java.util.ArrayList;
    import java.util.function.Predicate;
    import java.util.regex.Pattern;
    
    import static org.assertj.core.api.Assertions.assertThat;
    
    public class MultipleConditionsTest {
        @Test
        public void test() {
            // Given
            String someString = "", regex = "";
            // When
            ArrayList<String> actual = new ArrayList<>();
            // Then
            assertThat(actual)
                    .anyMatch(contains(someString).or(matchesRegex(regex)));
        }
    
        private static Predicate<? super String> matchesRegex(String regex) {
            return string ->Pattern.compile(regex).matcher(string).matches();
    
        }
    
        private static Predicate<String> contains(String someString) {
            return string -> string.equalsIgnoreCase(someString);
        }
    }
    

    that you can combine as you wish, like this

    @Test
    public void containsOrMatchesRegexTest() {
        // Given
        // When
        List<String> fruits = Arrays.asList("banana", "apple", "orange");
        // Then
        assertThat(fruits)
                .as("At least one element should contain 'raspberry' or match the regex 'a.+?'")
                .anyMatch(contains("raspberry").or(matchesRegex("a.+?")))
                .as("At least one element should contain 'banana' or match the regex 'p.+?'")
                .anyMatch(contains("banana").or(matchesRegex("p.+?")))
                .as("No element should contain 'blueberry' or match the regex '.+?c.+?'")
                .noneMatch(contains("blueberry").or(matchesRegex(".+?c.+?")))
        ;
    }