【问题标题】:hamcrest: how to match array is subset of another array?hamcrest:如何匹配数组是另一个数组的子集?
【发布时间】:2014-11-24 06:57:41
【问题描述】:

鉴于:

int[] a = {1, 2, 3, 4};
int[] b = {1, 2, 3, 4, 5};

如何使用 hamcrest 匹配器断言“a”是“b”的子集?

以下作品

assertThat(Arrays.asList(b), hasItems(a));

但由于我是从“b”创建“a”,所以我更愿意将“a”上的断言应用为值。 像

assertThat(a, isSubsetOf(b));

此外,最好避免将数组转换为列表。

【问题讨论】:

    标签: java junit hamcrest


    【解决方案1】:

    您可以使用EveryIsIn 匹配器的组合:

    assertThat(Arrays.asList(a), everyItem(in(b)));
    

    这确实会检查a 的每个项目是否包含在b 中。确保abInteger[] 类型,否则您可能会得到意想不到的结果。

    如果您使用的是较旧版本的 hamcrest(例如 1.3),您可以使用以下内容:

    assertThat(Arrays.asList(a), everyItem(isIn(b)));
    

    在最新版本isIn is deprecated in favor of in.

    【讨论】:

    • 以上是一个很棒的发现。唯一的问题是是否需要支持重复项。如果a 包含两个3 值,但b 只包含一个,则以上将给出误报。
    • @JohnB 我的印象是 OP 并不关心这些重复项,因为建议使用 assertThat(Arrays.asList(b), hasItems(a)) 也不能处理这种情况。但是,如果您确实关心必须像@kmmanu 建议的那样编写自己的更复杂的匹配器,那么您是绝对正确的。
    • 这对我有用。重要的是检查它是否是一个子集。现在我将忽略重复项。
    【解决方案2】:

    通过扩展org.hamcrest.TypeSafeMatcher 创建您自己的自定义匹配器,并在assertThat() 方法中使用它。你可以参考org.hamcrest.collection.IsArrayContaining的代码,创建自己的matcher

    【讨论】:

    • 是的,如果 hamcrest 没有可用的选项。
    【解决方案3】:

    如果您可以选择assertj

        assertThat(b).contains(a); // order doesn't matter
        assertThat(b).containsSequence(a); // order matters
    

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2010-09-24
      • 1970-01-01
      • 2016-12-13
      • 2022-09-27
      相关资源
      最近更新 更多