关于Java:比较JUnit断言中的数组,简洁的内置方法?

Comparing arrays in JUnit assertions, concise built-in way?

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

EG,不起作用:

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

当然,我可以手动执行以下操作:

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

..但是还有更好的方法吗?


使用org.junit.Assert的方法assertArrayEquals

1
2
3
4
import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

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


您可以使用Arrays.equals(..)

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


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

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

这样,我可以清楚地看到错误的值在哪里。这仅对小型数组有效,但在单元测试中,我很少使用数组项多于7的数组。

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


Assert.assertArrayEquals("message", expectedResult, result)


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

1
2
3
4
5
6
import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*;

//...

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

故障跟踪输出:

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

我知道问题是针对JUnit4的,但是如果您碰巧停留在JUnit3上,则可以创建一个简短的实用函数,如下所示:

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

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