2017-01-24 2 views
2
List<String> expectedStrings = Arrays.asList("link1", "link2"); 
List<String> strings = Arrays.asList("lalala link1 lalalla", "lalalal link2 lalalla"); 

Для каждой ожидаемой строки мне нужно утверждать, что любая строка в «строках» содержит expectString. Как я могу утверждать это с помощью Хамкреста? Спасибо за внимание.Утвердить, что одна из строк в массиве содержит подстроку

+0

Вам нужно будет сообщить нам, что вы пробовали. –

ответ

2

Вы можете сделать это довольно легко с потоками:

assertThat(expectedStrings.stream().allMatch(
    expectedString -> strings.stream() 
          .anyMatch(string -> string.contains(expectedString))), 
    is(true)); 

allMatch удостоверится все expectedStrings будут проверены, и с помощью anyMatch на strings можно эффективно проверить, если какой-либо из строк содержит ожидаемый строка.

+0

Это хорошо. Теперь я понимаю, что сделал неправильный вывод, и мой ответ был неправильным. Отлично сработано. –

+0

Это работа! Спасибо! – Hamster

0

На данный момент в этом исправлении нет никакого помощника, несмотря на то, что вы можете комбинировать несколько, это пока невозможно.

Итак, в таких случаях, как ваше, лучшее решение на мой взгляд - Создайте свой собственный матчи Почему?

  • Он может быть использован повторно
  • ремонтопригодно
  • ли более читаемым

Так что в вашем случае вы должны соответствовать первый список содержит любую строку второй, вы может создать соответствующий, как следующий:

public class ContainsStringsOf extends BaseMatcher<List<String>> { 

    private final List<String> valuesToCompare; 

    public ContainsStringsOf(List<String> valuesToCompare) { 
     this.valuesToCompare = valuesToCompare; 
    } 

    @Override 
    public void describeTo(Description description) { 
     description.appendText("doesn't contains all of " + valuesToCompare.toString() + " text"); 
    } 

    @Override 
    public boolean matches(Object o) { 
     List<String> values = (List<String>) o; 
     for (String valueToCompare : valuesToCompare) { 
      boolean containsText = false; 
      for (String value : values) { 
       if (value.contains(valueToCompare)) { 
        containsText = true; 
       } 
      } 
      if (!containsText) { 
       return false; 
      } 
     } 
     return true; 
     //note: you can replace this impl with java-8 @florian answer comparison 
     //return valuesToCompare.stream().allMatch(exp -> strings.stream().anyMatch(st-> st.contains(exp))) 
    } 

    @Factory 
    public static Matcher<List<String>> containsStringsOf(List<String> collection) { 
     return new ContainsStringsOf(collection); 
    } 
} 

Тогда вы можете использовать его как раз в качестве совпадающего помощника:

List<String> expectedStrings = Arrays.asList("link1", "link2"); 
List<String> strings = Arrays.asList("lalala link1 lalalla", "lalalal link2 lalalla"); 
Assert.assertThat(strings , containsStringsOf(expectedStrings)); 
Смежные вопросы