Сравнение массивов в утверждениях JUnit, сжатый встроенный способ?

Есть ли сжатый, встроенный способ сделать равным утверждениям на двух типизированных массивах в 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]);

.. но есть ли лучший способ?

Ответ 1

Используйте org.junit.Assert метод assertArrayEquals:

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Если этот метод недоступен, возможно, вы случайно импортировали класс Assert из junit.framework.

Ответ 2

Вы можете использовать Arrays.equals(..):

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

Ответ 4

Я предпочитаю преобразовывать массивы в строки:

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

таким образом я могу ясно видеть, где неправильные значения. Это эффективно работает только для небольших массивов, но я редко использую массивы с большим количеством элементов, чем 7 в своих модульных тестах.

Этот метод работает для примитивных типов и для других типов, когда перегрузка toString возвращает всю необходимую информацию.

Ответ 5

Я знаю, что вопрос для JUnit4, но если вы случайно застряли в JUnit3, вы можете создать такую ​​короткую служебную функцию:

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

В JUnit3 это лучше, чем прямое сравнение массивов, поскольку оно будет точно определять, какие элементы отличаются.

Ответ 6

Используя 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>]