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

有一种简洁的内置方式可以在JUnit中的两个相似types的数组上进行相等的断言吗? 默认情况下(至less在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]); 

有没有更好的办法?

使用org.junit.Assert的方法assertArrayEquals

 import org.junit.Assert; ... Assert.assertArrayEquals( expectedResult, result ); 

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

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

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

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

我宁愿将数组转换为string:

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

这样我可以清楚地看到错误的值在哪里。 这只对小型数组有效,但在unit testing中很less使用数组多于7的数组。

此方法适用于基本types和其他types,当toString重载返回所有重要信息时。

我知道这个问题是针对JUnit4的,但是如果你恰好被困在JUnit3中,你可以创build一个简短的效用函数:

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

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

使用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>]