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
가 모든 필수 정보 를 리턴 할 때 기본 유형 및 기타 유형에 적용됩니다 .
답변
답변
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에서는 배열을 직접 비교하는 것보다 낫습니다. 정확히 어떤 요소가 다른지 자세히 설명하기 때문입니다.