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

對於每個expectedString,我需要聲明'strings'中的任何字符串都包含expectedString。 我可以用Hamcrest來表達這個嗎? 感謝您的關注。斷言數組中的一個字符串包含子字符串

+0

你需要告訴我們你已經嘗試了什麼。 –

回答

2

你可以用流做到這一點很容易:

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

allMatch將確保所有expectedStrings將進行檢查,並使用anyMatchstrings可以有效地檢查是否有任何字符串包含預期串。

+0

這很好。我現在意識到,我做了一個不正確的推論,而我的回答是錯誤的。做得好。 –

+0

這是工作!謝謝! – Hamster

0

目前沒有任何匹配器在hamcrest與此requeiment,儘管你可以結合多個這是不可能的。

因此,在像您這樣的情況下,我認爲最好的解決方案是創建您自己的匹配器爲什麼?

  • 它可以重複使用
  • 是維護
  • 更具有可讀性

所以你的情況,你需要匹配第一個列表包含了第二個任意字符串,你可以創建像下一個匹配器:

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); 
    } 
} 

然後你可以使用它只是作爲hamcrest匹配使用:

List<String> expectedStrings = Arrays.asList("link1", "link2"); 
List<String> strings = Arrays.asList("lalala link1 lalalla", "lalalal link2 lalalla"); 
Assert.assertThat(strings , containsStringsOf(expectedStrings)); 
相關問題