Question

Hamcrest works well for primitive data types due to automatic boxing and unboxing like in this case:

assertThat(1, is(1));

However, I would like to use hamcrest's hasItemInArray matcher with a primitive type array like this:

int[] values = someMethodCall();
assertThat(values, hasItemInArray(1));

Since there is no automatic boxing/unboxing for arrays of primitive data types the above code does not compile. Is there any preferred way of accomplishing the above, other than manually converting from int[] to Integer[]?

Was it helpful?

Solution

AFAIK there isn't an automatic way of achieving this. If you can make use of 3rd party libraries you might want to check out the Apache Commons Lang library which provides an ArrayUtils class with a conversion method:

Integer[] toObject(int[] array)

int[] values = someMethodCall();
Integer[] objValues = ArrayUtils.toObject(values);
assertThat(objValues , hasItemInArray(1));

OTHER TIPS

Here is my solution it also uses Apache Commons ArrayUtils#toObject

With the imports

import static org.apache.commons.lang3.ArrayUtils.toObject;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.arrayContaining;
import static org.hamcrest.Matchers.arrayContainingInAnyOrder;
import static org.hamcrest.Matchers.hasItemInArray;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;

You can write readable tests like

@Test
void primitiveArrayTest() {
    int[] actual = new int[]{1, 2, 3};

    assertThat(toObject(actual), is(arrayContaining(1, 2, 3)));
    assertThat(toObject(actual), is(arrayContainingInAnyOrder(2, 3, 1)));
    assertThat(toObject(actual), hasItemInArray(2));
    assertThat(toObject(actual), is(not(arrayContaining(-5))));
}

The is is just used to improve the readability.

Yet an alternative to writing your own matcher would be to use one in a matcher library like conmatch.

int[] values = someMethodCall();
assertThat(values, intArrayContaining(1));

I guess there are already other Matchers available on github.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top