使用具有基本类型数组的hamcrest匹配器

时间:2013-08-21 19:33:39

标签: java testing hamcrest

Hamcrest适用于原始数据类型,因为在这种情况下会自动装箱和取消装箱:

assertThat(1, is(1));

但是,我想使用hamcrest的hasItemInArray匹配器和这样的基本类型数组:

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

由于原始数据类型的数组没有自动装箱/拆箱,因此上述代码无法编译。除了从int[]手动转换为Integer[]之外,还有其他方法可以实现上述目标吗?

3 个答案:

答案 0 :(得分:12)

AFAIK没有实现这一目标的自动方式。如果您可以使用第三方库,则可能需要查看Apache Commons Lang库,其中ArrayUtils类提供转换方法:

Integer[] toObject(int[] array)

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

答案 1 :(得分:1)

这是我的解决方案,它也使用Apache Commons ArrayUtils#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仅用于提高可读性。

答案 2 :(得分:0)

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

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

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