将 hamcrest 匹配器与基元类型数组一起使用

2022-09-01 17:46:43

Hamcrest适用于原始数据类型,因为自动装箱和取消装箱,例如:

assertThat(1, is(1));

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

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

由于基元数据类型的数组没有自动装箱/取消装箱,因此上述代码不会编译。除了手动从 转换为 之外,是否有任何首选方法可以完成上述操作?int[]Integer[]


答案 1

AFAIK没有一种自动的方法来实现这一目标。如果你可以使用第三方库,你可能想看看Apache Commons Lang库,它提供了一个带有转换方法的ArrayUtils类:

Integer[] toObject(int[] array)

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

答案 2

这是我的解决方案,它也使用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