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


159

在JUnit中是否有一种简洁的内置方法对两个相似类型的数组进行相等声明?默认情况下(至少在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]);

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

Answers:


297

使用org.junit.Assert的方法assertArrayEquals

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

如果此方法不可用,则可能是您不小心从中导入了Assert类junit.framework


但是当不同长度的失败时,你得到的只有java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7。由于大多数JUnit故障消息不是那么有用...我建议使用一些断言框架
user1075613

1
@ user1075613-我发现它很有帮助。我们断言数组相等,但不相等,并给出了原因。从那里,我们可以设置一个断点,并详细检查数组。
安迪·托马斯

1
是的,有点帮助。但是,正如您指出的那样,收到此消息后,您立即问自己“为什么长度不一样?” 所以您要检查内容。当良好的错误消息可以直接告诉调试器时,为什么还要浪费时间去调试器呢?(确保有时您仍然需要调试器,但是大多数时候不需要)
user1075613

您可以将问题提交到JUnit的问题跟踪系统。但是请记住,1)在O(1)中快速失败可能是一个优势,2)断言失败输出不应为O(n)。JUnit问题跟踪系统是一个更好的论坛,可供进一步讨论。
安迪·托马斯

1
@anddero- Assert.assertFalse( Arrays.equals( expectedResult, result ))
安迪·托马斯

35

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

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

14
但是,令人讨厌的是,您没有获得有关失败时出错的数据。
mBria 2010年

8
当您使用旧版junit(例如,在Android上)时
很好

2
如果要查看哪些字节不匹配,可以将其转换为字符串:assertEquals(Arrays.toString(expectedResult),Arrays.toString(result));
Erdem,2015年

17

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

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

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

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



4

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

2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.