Hamcrest containsInAnyOrder 匹配如果字符串包含

Hamcrest containsInAnyOrder match if string contains

假设我有

@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 似乎只有在每个条目都完全匹配时才会通过。

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

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

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

assertThat(布料, hasItem(包含("shi")))

默认情况下 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")));