Hamcrest适用于原始数据类型,因为在这种情况下会自动装箱和取消装箱:
assertThat(1, is(1));
但是,我想使用hamcrest的hasItemInArray
匹配器和这样的基本类型数组:
int[] values = someMethodCall();
assertThat(values, hasItemInArray(1));
由于原始数据类型的数组没有自动装箱/拆箱,因此上述代码无法编译。除了从int[]
手动转换为Integer[]
之外,还有其他方法可以实现上述目标吗?
答案 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了。