比较JUnit断言中的数组,简洁的内置方式?

在JUnit中是否有一种简洁的、内置的方法来对两个相似类型的数组执行等于断言?默认情况下(至少在JUnit 4中),它似乎对数组对象本身进行实例比较。

EG,不起作用:

int[] expectedResult = new int[] { 116800,  116800 };
int[] result = new GraphixMask().sortedAreas(rectangles);
assertEquals(expectedResult, result);

当然,我可以手动使用:

assertEquals(expectedResult.length, result.length);
for (int i = 0; i < expectedResult.length; i++)
assertEquals("mismatch at " + i, expectedResult[i], result[i]);

..但是有没有更好的办法呢?

172506 次浏览

你可以使用Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result));

使用org.junit.Assert的方法assertArrayEquals:

import org.junit.Assert;
...


Assert.assertArrayEquals( expectedResult, result );

如果此方法不可用,则可能意外地从junit.framework导入了Assert类。

我知道这个问题是针对JUnit4的,但如果你碰巧被JUnit3卡住了,你可以创建一个简短的效用函数,像这样:

private void assertArrayEquals(Object[] esperado, Object[] real) {
assertEquals(Arrays.asList(esperado), Arrays.asList(real));
}

在JUnit3中,这比直接比较数组要好,因为它将详细说明哪些元素不同。

我更喜欢将数组转换为字符串:

Assert.assertEquals(
Arrays.toString(values),
Arrays.toString(new int[] { 7, 8, 9, 3 }));

这样我就可以清楚地看到错误的值在哪里。这种方法只适用于小型数组,但在单元测试中,我很少使用项目超过7个的数组。

此方法适用于基本类型和当toString重载返回所有基本信息时的其他类型。

使用junit4和Hamcrest可以得到一个比较数组的简洁方法。它还提供了错误在故障跟踪中的位置的详细信息。

import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*;


//...


assertThat(result, is(new int[] {56, 100, 2000}));

故障跟踪输出:

java.lang.AssertionError:
Expected: is [<56>, <100>, <2000>]
but: was [<55>, <100>, <2000>]

org.junit.jupiter.api中的类断言 .api中的类断言

使用:

public static void assertArrayEquals(int[] expected,
int[] actual)

JUnit 5我们可以导入断言并使用断言。assertArrayEquals方法

import org.junit.jupiter.api.Assertions;


Assertions.assertArrayEquals(resultArray,actualResult);