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 では、1 行で実行できます。

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

しかし、AssertJ では、リストを手動で反復処理する必要があるように見えます。

4

5 に答える 5

3

Assertj 3.6.0 ではallSatisfy assertionが導入されました。これにより、イテラブルの各要素に対してスコープ指定されたアサーションを実行できます。

したがって、あなたはあなたが望むことをすることができます

assertThat(actual).allSatisfy(elem -> assertThat(elem).contains("alex"));
于 2017-03-27T23:11:08.633 に答える
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 に答える
0

私はそのようなもののためにJava 8ストリーム機能に依存しています:

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