26

由于自动装箱和拆箱,Hamcrest 适用于原始数据类型,如下例所示:

assertThat(1, is(1));

但是,我想将 hamcrest 的hasItemInArray匹配器与这样的原始类型数组一起使用:

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

由于原始数据类型的数组没有自动装箱/拆箱,因此上述代码无法编译。int[]除了手动从to转换之外,是否有任何首选方法可以完成上述操作Integer[]

4

3 回答 3

16

AFAIK 没有实现这一目标的自动方法。如果您可以使用 3rd 方库,您可能需要查看Apache Commons Lang库,它提供了一个带有转换方法的ArrayUtils类:

Integer[] toObject(int[] 数组)

int[] values = someMethodCall();
Integer[] objValues = ArrayUtils.toObject(values);
assertThat(objValues , hasItemInArray(1));
于 2013-08-21T20:18:45.743 回答
1

这是我的解决方案,它也使用 Apache CommonsArrayUtils#toObject

随着进口

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;

您可以编写可读的测试,例如

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

is只是用来提高可读性。

于 2020-01-16T22:05:26.127 回答
0

然而,编写自己的匹配器的另一种方法是在诸如conmatch 之类的匹配器库中使用一个。

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

我猜 github 上已经有其他 Matchers 可用了。

于 2016-09-01T19:48:47.050 回答