[Java/자바] JUnit5 Assertions 예제 정리

이번 포스팅에선 JUnit5의 Assertions으로 테스트 코드 작성하는 법에 대해 알아보고자 합니다.

JUnit5의 어노테이션과 메서드들은 아래 링크에 설명해놨으니 참고 하시면 됩니다.

 

[Java/자바] JUnit5란?

JUnit5 이란 ? Java 개발자가 가장 많이 사용하는 테스팅 프레임워크로, JAVA 8 버전부터 사용 가능하며 테스트 주도 개발(TDD, Test Driven Development)을 위해 사용됩니다. 요구사항을 검증하는 테스트 케

hstory0208.tistory.com


JUnit 5 Assertions

assertArrayEquals

예상 배열(expected)과 실제 배열(actual))이 동일한지 확인합니다.

두 배열이 일치 하지 않다면, 마지막 인자인 메세지가 출력됩니다.

@Test
public void whenAssertingArraysEquality_thenEqual() {
    char[] expected = { 'J', 'u', 'p', 'i', 't'};
    char[] actual = "Jupiter".toCharArray();

    assertArrayEquals(expected, actual, "두 배열이 일치하지 않습니다.");
}

 

assertEquals

두 값을 비교하여 일치하는지 확인합니다.

    @Test
    public void whenAssertingEquality_thenEqual() {
        float square = 2 * 2;
        float rectangle = 2 * 2;

        assertEquals(square, rectangle);
    }

 

실제 값이 예상 값의 차이가 있을 경우, 세 번째 인자로 차이가 나는 값을 가진 delta를 추가합니다

    @Test
    void whenAssertingEqualityWithDelta_thenEqual() {
        float square = 2 * 2;
        float rectangle = 3 * 2;
        float delta = 2;

        assertEquals(square, rectangle, delta);
    }

 

assertNotEquals

예상 값과 실제 값이 다른지 확인 합니다.

같을 경우 메시지를 출력합니다.

@Test
void whenAssertingEquality_thenNotEqual() {
    Integer value = 5; 

    assertNotEquals(0, value, "The result cannot be 0");
}

 

assertTrue and assertFalse

assertTrue는 주어진 조건이 참인지 확인합니다.

조건이 거짓일 경우 마지막 인자인 메시지를 출력합니다.

    @Test
    void whenAssertingConditions_thenVerified() {
        assertTrue(5 > 4, "5 is greater the 4");
        assertTrue(null == null, "null is equal to null");
    }

 

assertFalse는 주어진 조건이 거짓인지 확인 합니다.

조건이 참일 경우 마지막 인자인 메시지를 출력합니다.

    @Test
    public void givenBooleanSupplier_whenAssertingCondition_thenVerified() {
        assertFalse(5 > 6, "5 is not greater then 6");
    }

 

assertNull and assertNotNull

assertNull은 객체의 null 여부를 확인 합니다.

객체가 Null이 아닐 경우 메시지를 출력 합니다.

    @Test
    public void whenAssertingNull_thenTrue() {
        Object cat = null;

        assertNull(cat, "The cat should be null");
    }

 

assertNotNull은 객체가 Null이 아닌지를 확인 합니다.

객체가 Null일 경우 메시지를 출력 합니다.

    @Test
    void whenAssertingNotNull_thenTrue() {
        Object dog = new Object();

        assertNotNull(dog, "The dog should not be null");
    }

 

assertSame and assertNotSame

assertSame은 예상 값과 실제 값이 동일한 객체를 참조하는지 확인 합니다.

    @Test
    public void whenAssertingSameObject_thenSuccessfull() {
        String language = "Java";
        String MyLanguage = "Java";

        assertSame(language, MyLanguage);
    }

 

반대로, assertNotSame은 예상 값과 실제 값이 다른 객체를 참조하는지 확인합니다.

    @Test
    public void whenAssertingSameObject_thenSuccessfull() {
        String language = "Java";
        String anotherLanguage = "JavaScript";

        assertNotSame(language, anotherLanguage);
    }

 

fail

테스트를 실패 처리하며 실패 메시지를 함께 출력합니다.

개발이 완료되지 않은 테스트를 표시할 때 유용

    @Test
    public void whenFailingATest_thenFailed() {
        // Test not completed
        fail("FAIL - test not completed");
    }

 

assertAll

assertAll안에 작성된 모든 Assertion이 실행됩니다.

 

한 메소드에 assert함수를 여러개 선언 후 테스트를 진행할 시 상단 assert함수에서 오류가 발생하면 그 밑 함수들을 실행되지가 않습니다.
하지만, assertAll()로 해당 수들을 묶을 시 중간에 assert함수가 실행이 되지 않더라도 assert의 모든 함수를 실행할 수 있습니다.

단, 실행 중 예외(Out Of Memory Error 등)를 발생시키는 경우에만 중단됩니다.

    @Test
    void givenMultipleAssertion_whenAssertingAll_thenOK() {
        Object obj = null;
        assertAll(
                "heading",
                () -> assertEquals(4, 2 * 2, "4 is 2 times 2"),
                () -> assertEquals("java", "JAVA".toLowerCase()),
                () -> assertNull(obj, "obj is null")
        );
    }

 

assertIterableEquals

예상된 반복 가능 항목과 실제 반복 가능 항목이 완전히 동일한지 확인합니다.

두 Iterable은 동일한 순서로 동일한 요소를 반환해야 하며, 두 Iterable이 동일한 유형일 필요는 없습니다.

@Test
void givenTwoLists_whenAssertingIterables_thenEquals() {
    Iterable<String> al = new ArrayList<>(asList("Java", "Junit", "Test"));
    Iterable<String> ll = new LinkedList<>(asList("Java", "Junit", "Test"));

    assertIterableEquals(al, ll);
}

 

assertLinesMatch

예상 목록이 실제 목록과 일치하는지 확인합니다.

이 메서드는 assertEquals 및 assertItableEquals와는 다릅니다.

  1. 예상 라인이 실제 라인과 동일한지 확인. 동일할 경우 다음 쌍으로 계속 진행
  2. 예상되는 행을 정규 표현으로 처리하여 String.matches() 메서드를 사용하여 체크를 수행. 동일할 경우 다음 쌍으로 계속 진행
  3. 예상되는 라인이 fast-forward marker  확인.동일할 경우 fast-forward를 적용하고 스텝1부터 알고리즘을 반복
@Test
void whenAssertingEqualityListOfStrings_thenEqual() {
    List<String> expected = asList("Java", "\\d+", "JUnit");
    List<String> actual = asList("Java", "11", "JUnit");

    assertLinesMatch(expected, actual);
}

 

assertThrows

특정 예외가 발생했는지 확인합니다.

첫 번째 인자는 "확인할 예외 클래스", 두 번째 인자는 "테스트하려는 코드"를 입력합니다.

@Test
void whenAssertingException_thenThrown() {
    Throwable exception = assertThrows(
            IllegalArgumentException.class,
            () -> {
                throw new IllegalArgumentException("Exception message");
            }
    );
    assertEquals("Exception message", exception.getMessage());
}

 

assertTimeout and assertTimeoutPreemptively

assertTimeout은 특정 시간 안에 실행이 끝나는지 확인 합니다.

assertTimeoutPreemptively은 지정한 시간 내 끝나지 않으면 바로 종료합니다.

 

아래 코드는 2초 이내에 그 다음 인자인 "Executable 코드"가 실행완료 되어야 합니다.

여기서 실행한 코드는 Thread.sleep(1000) 으로, 1초동안 일시 정지 상태가 됩니다.

그렇기 때문에 2초 이내에 코드가 실행되어 테스트는 통과하게 됩니다. 

만약 Thread.sleep(2000), Thread.sleep(3000) 으로 실행하게 된다면 2초 이내인 조건을 만족하지 못하므로 실패하게 됩니다.

@Test
void whenAssertingTimeout_thenNotExceeded() {
    assertTimeout(
            ofSeconds(2),
            () -> {
                Thread.sleep(1000);
            }
    );
}

참고자료
https://velog.io/@ynjch97/JUnit5-JUnit5-%EA%B5%AC%EC%84%B1-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-Assertions-%EC%A0%95%EB%A6%AC#1-4-junit5-assertions
https://www.baeldung.com/junit-assertions