2015-09-28 7 views
3

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

У меня есть список писем и вам нужно сделать 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(); 

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

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

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

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

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

ответ

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")); 
0

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

assertThat(actual.stream().allMatch(s -> s.contains("alex"))).isTrue(); 
+0

Спасибо, я вижу вашу точку зрения, но это будет производить неясное сообщение на провал, как «Ожидая [верно], но был [ложь] –

2

Вы можете построить условие 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); 

}

1

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

Таким образом, вы могли бы сделать то, что вы хотите с

assertThat(actual).allSatisfy(elem -> assertThat(elem).contains("alex")); 

 Смежные вопросы

  • Нет связанных вопросов^_^