17

Given that:

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

How to asser that "a" is a subset of "b" using hamcrest matchers?

The following works

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

But since I am creating "a" from "b", I would prefer to apply the asserts on "a" as the value. Something like

assertThat(a, isSubsetOf(b));

Additionally it is preferable to avoid converting the array to a list.

Kiran Mohan
  • 2,696
  • 6
  • 36
  • 62

3 Answers3

26

You can use a combination of the Every and IsIn matcher:

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

This does check if every item of a is contained in b. Make sure a and b are of type Integer[] otherwise you might get unexpected results.

If you are using an older version of hamcrest (for example 1.3) you can use the following:

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

In the latest version isIn is deprecated in favor of in.

eee
  • 3,241
  • 1
  • 17
  • 34
  • The above is a great find. The only issue would be if duplicates need to be supported. If `a` contains two `3` values but `b` only contains one, the above would give a false positive. – John B Nov 24 '14 at 20:29
  • @JohnB I got the impression that the OP doesn't care about those duplicates because of the suggestion to use `assertThat(Arrays.asList(b), hasItems(a))` which doesn't handle this case either. But you are absolutely right if you do care you have to write your own more sophisticated matcher like @kmmanu suggested. – eee Nov 25 '14 at 06:38
  • This works for me. The important thing is to check if its a subset.For now i will ignore the duplicates. – Kiran Mohan Nov 25 '14 at 14:06
2

Create your own custom matcher by extending org.hamcrest.TypeSafeMatcher and use it in the assertThat() method. You can refer the code of org.hamcrest.collection.IsArrayContaining and create your own matcher

Manu
  • 3,467
  • 3
  • 29
  • 28
1

If assertj is an option for you:

    assertThat(b).contains(a); // order doesn't matter
    assertThat(b).containsSequence(a); // order matters
Frank Neblung
  • 3,047
  • 17
  • 34