Аналог каждого элемента () из Hamcrest в AssertJ

Есть ли аналог EveryItem() из Hamcrest в AssertJ?

У меня есть список электронных писем, и мне нужно сделать подтверждение, чтобы убедиться, что каждое электронное письмо содержит подстроку "alex". В настоящее время единственный способ сделать это с AssertJ заключается в следующем:

    List<String> actual = Arrays.asList("alex@gmail.com", "alex1@gmail.com", "ale2@hotmail.com", "bred@gmail.com");

    SoftAssertions softly = new SoftAssertions();
    for(String email: actual ) {
        softly.assertThat(email).contains("alex");
    }

    softly.assertAll();

Там тоже можно обойтись без мягких утверждений, но я бы предпочел проверить все пункты списка.

Есть ли более компактный способ сделать это? Если быть точным, есть ли в AssertJ способ проверить каждый элемент списка на соответствие подстроке?

В Hamcrest я могу сделать это одной строкой:

assertThat(actual, everyItem(containsString("alex")));

Но в AssertJ выглядит так, как будто мне приходится вручную перебирать список.

4 ответа

В Assertj 3.6.0 введено утверждение allSatisfy, которое позволяет выполнять утверждения с ограничениями для каждого элемента итерируемого элемента.

Поэтому вы можете делать то, что вы хотите с

assertThat(actual).allSatisfy(elem -> assertThat(elem).contains("alex"));

Я нашел 2 решения: 1) использовать Java 8

actual.forEach( val -> softly.assertThat(val).contains("alex"));

2) сделать полезный класс

public class AssertUtils {
    public static Condition<String> ContainsCondition(String val) {
        return new Condition<String>() {
            @Override
            public boolean matches(String value) {
                return value.contains(val);
            }
        };
    }
}

и использовать это:

softly.assertThat(actual).are(AssertUtils.ContainsCondition("alex"));

Вы можете построить условие AssertJ с помощью предиката и использовать / иметь утверждение:

 @Test
 public void condition_built_with_predicate_example() {
     Condition<String> fairyTale = new Condition<String>(s -> s.startsWith("Once upon a time"), "a %s tale", "fairy");
     String littleRedCap = "Once upon a time there was a dear little girl ...";
     String cindirella = "Once upon a time there was a ...";
     assertThat(asList(littleRedCap, cindirella)).are(fairyTale);

}

Я предпочитаю использовать эту форму allMatch следующим образом:

assertThat(movies).extracting("title").allMatch(s -> s.toString().contains("the"));

Я просто полагаюсь на функциональность потока Java 8 для такого рода вещей:

assertThat(actual.stream().allMatch(s -> s.contains("alex"))).isTrue();
Другие вопросы по тегам