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.