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

.. 그러나 더 좋은 방법이 있습니까?



답변

org.junit.Assert 의 메소드를 사용하십시오 assertArrayEquals.

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

이 방법을 사용할 수 없으면에서 실수로 Assert 클래스를 가져 왔을 수 있습니다 junit.framework.


답변

당신은 사용할 수 있습니다 Arrays.equals(..):

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


답변

배열을 문자열로 변환하는 것을 선호합니다.

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

이렇게하면 잘못된 값이 어디에 있는지 명확하게 볼 수 있습니다. 이것은 작은 크기의 배열에서만 효과적으로 작동하지만 단위 테스트에서 7보다 많은 항목이있는 배열은 거의 사용하지 않습니다.

이 메소드는 과부하 toString가 모든 필수 정보 를 리턴 할 때 기본 유형 및 기타 유형에 적용됩니다 .


답변

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


답변

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


답변

JUnit4에 대한 질문이라는 것을 알고 있지만 JUnit3에 갇 히면 다음과 같은 짧은 유틸리티 함수를 만들 수 있습니다.

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

JUnit3에서는 배열을 직접 비교하는 것보다 낫습니다. 정확히 어떤 요소가 다른지 자세히 설명하기 때문입니다.


답변