Kiran Mohan
Kiran Mohan

Reputation: 2996

hamcrest: how to match array is subset of another array?

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.

Upvotes: 17

Views: 6562

Answers (3)

eee
eee

Reputation: 3458

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.

Upvotes: 26

Frank Neblung
Frank Neblung

Reputation: 3165

If assertj is an option for you:

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

Upvotes: 1

Manu
Manu

Reputation: 3625

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

Upvotes: 2

Related Questions