在AssertJ中是否存在来自Hamcrest的everyItem()的模拟?
我有一个电子邮件列表,需要做Assertion来检查每封电子邮件是否包含子字符串“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();
也可以在没有Soft Assertions的情况下完成,但我更愿意检查列表中的所有项目。
还有更紧凑的方法吗?具体来说,AssertJ中是否有一种方法可以检查列表中的每个项目以匹配子字符串?
在Hamcrest,我可以在一行中完成:
assertThat(actual, everyItem(containsString("alex")));
但是在AssertJ看来,无论如何我必须手动遍历列表。
答案 0 :(得分:2)
我找到了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"));
答案 1 :(得分:2)
您可以使用谓词构建AssertJ条件并使用is / have断言:
prog /path/to/* outfile
}
答案 2 :(得分:1)
Assertj 3.6.0引入了allSatisfy assertion,它允许您对可迭代的每个元素执行范围限制。
因此你可以用
做你想做的事assertThat(actual).allSatisfy(elem -> assertThat(elem).contains("alex"));
答案 3 :(得分:1)
我更喜欢使用以下形式的allMatch:
assertThat(movies).extracting("title").allMatch(s -> s.toString().contains("the"));
答案 4 :(得分:0)
我只是依靠Java 8流功能来实现这类功能:
assertThat(actual.stream().allMatch(s -> s.contains("alex"))).isTrue();