191

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

例如,不起作用:

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]);

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

4

8 回答 8

356

使用org.junit.Assert的方法assertArrayEquals

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

如果此方法不可用,您可能不小心从junit.framework.

于 2010-11-19T19:06:39.930 回答
39

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

assertTrue(Arrays.equals(expectedResult, result));
于 2010-11-19T18:29:16.020 回答
21

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

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

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

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

于 2016-02-13T09:15:31.873 回答
15

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

于 2010-11-19T18:41:52.510 回答
5

使用 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>]
于 2017-09-05T05:59:16.817 回答
5

JUnit 5 我们可以只导入 Assertions 并使用 Assertions.assertArrayEquals 方法

import org.junit.jupiter.api.Assertions;

Assertions.assertArrayEquals(resultArray,actualResult);
于 2021-06-20T09:09:54.790 回答
4

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

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

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

于 2016-01-27T10:03:03.940 回答
1

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

采用:

public static void assertArrayEquals(int[] expected,
                                     int[] actual)
于 2020-12-21T05:41:01.237 回答