Аналог каждого элемента () из 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();