[JUnit5] 테스트 작성(6) - Nested Test
JAVA/JUnit

[JUnit5] 테스트 작성(6) - Nested Test

보통은 클래스를 분리해서 테스트를 진행하나, 일부의 테스트의 경우 테스트 간의 관계를 표현하기 위해서 중첩 클래스를 이용하는 경우가 있습니다. 이런 경우에 '@Nested'를 사용합니다.

 

추가적으로 가장 많이 쓰는 이유는, 전체 테스트 클래스의 메커니즘을 파악하는데 굉장히 유용하기 때문입니다.

@DisplayName("A stack")
public class NestedTest {

    Stack<Object> stack;

    @Test
    @DisplayName("is instantiated with new Stack()")
    void isInstantiatedWithNew() {
        new Stack<>();
    }

    @Nested
    @DisplayName("when new")
    class WhenNew {

        @BeforeEach
        void createNewStack() {
            stack = new Stack<>();
        }

        @Test
        @DisplayName("is empty")
        void isEmpty() {
            assertTrue(stack.isEmpty());
        }

        @Test
        @DisplayName("throws EmptyStackException when popped")
        void throwsExceptionWhenPopped() {
            assertThrows(EmptyStackException.class, stack::pop);
        }

        @Test
        @DisplayName("throws EmptyStackException when peeked")
        void throwsExceptionWhenPeeked() {
            assertThrows(EmptyStackException.class, stack::peek);
        }

        @Nested
        @DisplayName("after pushing an element")
        class AfterPushing {

            String anElement = "an element";

            @BeforeEach
            void pushAnElement() {
                stack.push(anElement);
            }

            @Test
            @DisplayName("it is no longer empty")
            void isNotEmpty() {
                assertFalse(stack.isEmpty());
            }

            @Test
            @DisplayName("returns the element when popped and is empty")
            void returnElementWhenPopped() {
                assertEquals(anElement, stack.pop());
                assertTrue(stack.isEmpty());
            }

            @Test
            @DisplayName("returns the element when peeked but remains not empty")
            void returnElementWhenPeeked() {
                assertEquals(anElement, stack.peek());
                assertFalse(stack.isEmpty());
            }
        }
    }
}

결과

이렇게 각 라이프사이클과 메커니즘 계층을 한눈에 파악할 수 있습니다.

 

 

주의사항

static이 아닌 중첩 클래스(내부 클래스)에서만 '@Nested' 어노테이션이 사용 가능합니다.

JAVA는 내부 클래스에 static members를 허용하지 않기 때문에 이를 우회하고 싶은 경우에는 (4) 편에서 설명한 '@TestInstacne(Lifecycle.PER_CLASS)'를 이용하시면 됩니다.