3

AssertJ 中是否有来自 Hamcrest 的 everyItem() 的模拟?

我有一个电子邮件列表,需要进行断言以检查每封电子邮件是否包含子字符串“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

5 回答 5

3

Assertj 3.6.0 引入了allSatisfy 断言,它允许您对可迭代的每个元素执行范围断言。

因此你可以做你想做的事

assertThat(actual).allSatisfy(elem -> assertThat(elem).contains("alex"));
于 2017-03-27T23:11:08.633 回答
2

您可以使用谓词构建 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);

}

编辑:正如 Dan 所指出的,我现在将使用allSatisfy.

于 2015-09-30T02:49:02.843 回答
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"));
于 2015-09-28T19:11:38.357 回答
1

我更喜欢使用这种形式的 allMatch,如下所示:

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

于 2019-12-24T16:00:42.637 回答
0

我只是依靠 Java 8 的流功能来处理这类事情:

assertThat(actual.stream().allMatch(s -> s.contains("alex"))).isTrue();
于 2015-09-28T19:28:32.360 回答