Сравнение массивов в утверждениях 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));
Ответ 3
Assert.assertArrayEquals("message", 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>]