hamcrest:如何匹配数组是另一个数组的子集?

时间:2014-11-24 06:57:41

标签: java junit hamcrest

鉴于:

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));

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

3 个答案:

答案 0 :(得分:23)

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

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

这会检查a中是否包含b的每个项目。确保ab的类型为Integer[],否则可能会出现意外结果。

在最新版本中,将isIn替换为in,因为第一个has been deprecated

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果assertj是您的选项:

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