Using hamcrest matchers with primitive type arrays
Asked Answered
M

3

27

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[]?

Mandell answered 21/8, 2013 at 19:33 Comment(0)
W
16

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));
Wertz answered 21/8, 2013 at 20:18 Comment(1)
I guessed so already, but thanks for the confirmation and pointing me to Apache Commons!Mandell
G
1

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.

Gorse answered 16/1, 2020 at 22:5 Comment(0)
P
0

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.

Punishable answered 1/9, 2016 at 19:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.