2017-01-24 37 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)); 
相关问题