Аналог everyItem () из Hamcrest в AssertJ

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

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

    List<String> actual = Arrays.asList("[email protected]", "[email protected]", "[email protected]", "[email protected]");

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

    softly.assertAll();

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

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

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

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

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


person Alex F    schedule 28.09.2015    source источник


Ответы (5)


Assertj 3.6.0 представил заголовок allSatisfy assertion, которое позволяет выполнять утверждения с заданной областью для каждого элемента итерации.

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

assertThat(actual).allSatisfy(elem -> assertThat(elem).contains("alex"));
person Dan    schedule 27.03.2017

Я нашел 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"));
person Vovka    schedule 28.09.2015

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

 @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);

}

Изменить: как указал Дэн, я бы теперь использовал allSatisfy.

person Joel Costigliola    schedule 30.09.2015

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

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

person Elie Nehmé    schedule 24.12.2019

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

assertThat(actual.stream().allMatch(s -> s.contains("alex"))).isTrue();
person JB Nizet    schedule 28.09.2015
comment
Спасибо, я понимаю вашу точку зрения, но в случае неудачи будет выдано непонятное сообщение, например Expecting [true], но было [false] - person Alex F; 30.09.2015