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

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

답변:


298

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-도움이되었다고 생각합니다. 우리는 배열이 같다고 주장했고, 그렇지 않으며, 그 이유를 알 수 있습니다. 여기에서 중단 점을 설정하고 배열을 자세히 검사 할 수 있습니다.
Andy Thomas

1
맞습니다. 약간 도움이됩니다. 그러나 당신이 지적한대로, 당신은이 메시지가 즉시 "왜 같은 길이가 아닌가?"라고 스스로에게 묻습니다. 내용을 확인하고 싶습니다. 좋은 오류 메시지로 직접 알 수 있는데 디버거로 시간을 잃는 이유는 무엇입니까? (때로는 디버거가 여전히 필요하지만 대부분 그렇지 않은 경우도 있음)
user1075613

JUnit의 이슈 추적 시스템에 이슈를 제출할 수 있습니다 . 그러나 1) O (1)에서 빠르게 실패하면 이점이 될 수 있습니다. 2) 어설 션 실패 출력은 O (n)이 아니어야합니다. JUnit 이슈 추적 시스템은 추가 토론을위한 더 나은 포럼입니다.
Andy Thomas

1
@anddero- Assert.assertFalse( Arrays.equals( expectedResult, result )).
Andy Thomas

35

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

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

14
그럼에도 불구하고 문제는 실패했을 때 무엇이 ​​잘못되었는지에 대한 데이터를 얻지 못한다는 것입니다.
mBria

8
이전 junit 버전 (Android와 같은)을 사용하는 경우
유용

2
일치하지 않는 바이트를 보려면 문자열로 변환 할 수 있습니다. assertEquals (Arrays.toString (expectedResult), Arrays.toString (result));
Erdem December

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.