Hamcrest containsInAnyOrder如果字符串包含则匹配

时间:2019-01-04 20:31:03

标签: java junit hamcrest

假设我有

@Test
public void iterable_matches_order () {

    List<String> cloths = Lists.newArrayList("shirts", "shoes", "pants", "socks");

    assertThat(cloths, containsInAnyOrder("shi", "sho", "pan", "soc"));
}

我希望这通过,因为shi包含在shirts中,sho包含在shoes中,依此类推。 containsInAnyOrder似乎仅在每个条目完全匹配时才通过。

3 个答案:

答案 0 :(得分:1)

根据文档:http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#containsInAnyOrder(T...)与子字符串不匹配,而与整个字符串匹配

assertThat(Arrays.asList("foo", "bar"), containsInAnyOrder("bar", "foo"))

答案 1 :(得分:1)

您可以尝试使用以下内容,但不幸的是,您一次只能检查一个子字符串。您将必须有多个断言,因为您将不知道列表中哪个子字符串失败。

assertThat(cloths,hasItem(contains(“ shi”)))

答案 2 :(得分:0)

默认情况下,containsInAnyOrder通过equals方法匹配给定的元素。但是您可以提供任意子匹配器。在您的示例中,您可以使用Matchers.containsString方法:

assertThat(cloths, containsInAnyOrder(containsString("shi"), containsString("sho"),
    containsString("pan"), containsString("soc")));

请注意,如果您对cloths中的项目重新排序,上述声明也会成功。如果订单很重要,请使用Matchers.contains

assertThat(cloths, contains(containsString("shi"), containsString("sho"),
    containsString("pan"), containsString("soc")));