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

Java 比较JUnit断言中的数组,简洁的内置方式?,java,arrays,junit,assertions,Java,Arrays,Junit,Assertions,在JUnit中,有没有一种简洁、内置的方法来对两个类似类型的数组进行equals断言?默认情况下(至少在JUnit4中),它似乎对数组对象本身进行实例比较 例如,不起作用: int[] expectedResult = new int[] { 116800, 116800 }; int[] result = new GraphixMask().sortedAreas(rectangles); assertEquals(expectedResult, result); 当然,我可以通过以下方式

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

例如,不起作用:

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]);
assertEquals(expectedResult.length,result.length);
for(int i=0;i

…但是有更好的方法吗?

您可以使用
数组。equals(…)

使用的方法
assertarayequals

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,您可以获得比较数组的简明方法。它还详细说明了错误在故障跟踪中的位置

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>]
java.lang.AssertionError:
预期:为[,]
但是:是[,]

使用:


但最糟糕的是,当它失败时,你没有得到关于出错原因的数据。当你使用较旧的junit版本(比如Android)时,如果你想知道哪些字节不匹配,你可以将它们转换为字符串:assertEquals(Arrays.toString(expectedResult),Arrays.toString(result));嗯,我在我的“junit.framework.Assert”中没有看到任何“AssertArrayQuals”?4.8.1是我所拥有的,并且似乎是通过Maven()提供的最新版本。它只是在4.8.2或4.9中出现的吗?但当它因不同的长度而失败时,得到的结果是
java.lang.AssertionError:数组长度不同,应为。实际长度=6。长度=7
。与大多数JUnit失败消息一样,它没有那么大帮助……我建议使用一些断言framework@user1075613-我觉得这很有帮助。我们断言数组是相等的,但它们不是,我们得到了一个指示。从那里,我们可以设置一个断点,并详细检查数组。对,这有点帮助。然而,正如你所指出的,当你收到这条信息时,你会问自己“为什么它的长度不一样?”所以你想检查内容。当一条好的错误消息可以直接告诉调试器时,为什么还要浪费时间呢?(当然,您有时仍然需要调试器,但大多数情况下不需要)您可以将问题提交给。但是请记住,1)在O(1)中快速失败可能是一个优势,2)断言失败输出不应是O(n)。JUnit问题跟踪系统是进一步讨论的更好论坛。@anddero-
Assert.assertFalse(Arrays.equals(expectedResult,result))
java.lang.AssertionError: 
   Expected: is [<56>, <100>, <2000>]
   but: was [<55>, <100>, <2000>]
public static void assertArrayEquals(int[] expected,
                                     int[] actual)