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

mBr*_*ria 145 java arrays junit assertions

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

EG,不起作用:

int[] expectedResult = new int[] { 116800,  116800 };
int[] result = new GraphixMask().sortedAreas(rectangles);
assertEquals(expectedResult, result);
Run Code Online (Sandbox Code Playgroud)

当然,我可以手动完成:

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

..但有更好的方法吗?

And*_*mas 274

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

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );
Run Code Online (Sandbox Code Playgroud)

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

  • 但是当它因不同长度而失败时,你得到的只是“java.lang.AssertionError:数组长度不同,expected.length=6actual.length=7”。与大多数 JUnit 失败消息一样,它没有那么有帮助......我建议使用一些断言框架 (3认同)
  • @user1075613 - 我发现它很有帮助。我们断言数组是相等的,但它们不是,并且我们得到了原因的说明。从那里,我们可以设置一个断点,并详细检查数组。 (2认同)

Boz*_*zho 34

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

assertTrue(Arrays.equals(expectedResult, result));
Run Code Online (Sandbox Code Playgroud)

  • 虽然你没有得到关于失败时出了什么问题的数据,但是这有什么不好的地方. (13认同)
  • 当你使用较旧的junit版本时很好(比如在Android上) (8认同)
  • 如果要查看哪些字节不匹配,可以将它们转换为字符串:assertEquals(Arrays.toString(expectedResult),Arrays.toString(result)); (2认同)

Pra*_*jan 18

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

import org.junit.jupiter.api.Assertions;

Assertions.assertArrayEquals(resultArray,actualResult);
Run Code Online (Sandbox Code Playgroud)


csh*_*olk 16

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

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

通过这种方式,我可以清楚地看到错误值的位置.这仅适用于小型数组,但在单元测试中,我很少使用数量多于7的数组.

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


win*_*anr 5

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

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

//...

assertThat(result, is(new int[] {56, 100, 2000}));
Run Code Online (Sandbox Code Playgroud)

故障跟踪输出:

java.lang.AssertionError: 
   Expected: is [<56>, <100>, <2000>]
   but: was [<55>, <100>, <2000>]
Run Code Online (Sandbox Code Playgroud)