【问题标题】:Hamcrest containsInAnyOrder match if string contains如果字符串包含 Hamcrest containsInAnyOrder 匹配
【发布时间】:2019-01-04 20:31:02
【问题描述】:

假设我有

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

【问题讨论】:

    标签: java junit hamcrest


    【解决方案1】:

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

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

    【讨论】:

    • 是的,contains 这个词在这里非常具有误导性。
    【解决方案2】:

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

    assertThat(cloths, hasItem(contains("shi")))

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-10-07
        • 1970-01-01
        • 2022-09-24
        • 2015-09-15
        • 1970-01-01
        • 2016-06-15
        • 2019-04-24
        • 2016-08-23
        • 1970-01-01
        相关资源
        最近更新 更多