
간단히 말하면 @Nested는 JUnit 5(Jupiter)에서 테스트 클래스를 중첩하여 논리적 그룹(컨텍스트)을 만들기 위한 어노테이션입니다. 중첩된 내부 클래스를 하나의 테스트 컨텍스트로 취급해서 관련된 테스트들을 구조적으로 묶고, 외부 클래스의 상태/설정과 조합해 계층적 테스트를 작성할 수 있게 해줍니다. 주요 내용 - 역할: 관련 테스트들을 계층적으로 그룹화하여 가독성 개선, 공통 설정 공유, 테스트 의도(컨텍스트)를 명확히 표현. - 선언 조건: 중첩 클래스는 non-static(인스턴스 내부 클래스) 이어야 하고 @Nested로 표시해야 합니다. - 인스턴스/라이프사이클: - 기본적으로 JUnit은 각 테스트 메서드마다 새로운 테스트 인스턴스를 생성합니다. 중첩 클래스는 외부 인스턴스의 멤버에 접근할 수 있습니다. - 라이프사이클 훅 실행 순서: Before 계열은 외부 → 내부 순서로 실행되고, After 계열은 내부 → 외부 순서로 실행됩니다. - @BeforeAll / @AfterAll 제약: - 기본 설정(TestInstance.Lifecycle.PER_METHOD)에서는 @BeforeAll/@AfterAll은 static 메서드여야 합니다. non-static 내부 클래스에서는 static 선언이 불가능하므로 @BeforeAll을 쓰려면 클래스에 @TestInstance(Lifecycle.PER_CLASS)를 지정해야 합니다. - 다중 중첩 가능: 여러 단계로 중첩할 수 있으나 지나친 중첩은 복잡도를 높이므로 주의. 간단한 예 (Java, JUnit 5) public class CalculatorTest { @BeforeEach void outerSetUp() { /* 공통 초기화 */ } @Nested class WhenAdding { @BeforeEach void innerSetUp() { /* 더하기 관련 초기화 */ } @Test void addsTwoNumbers() { /* 테스트 */ } } @Nested class WhenSubtracting { @Test void subtractsTwoNumbers() { /* 테스트 */ } } } 사용 이유/장점 - 테스트들을 의미 있는 컨텍스트로 묶어 읽기 쉽고 유지보수하기 쉬움. - 외부 설정을 재사용하면서 각 컨텍스트별 추가 설정을 분리할 수 있음. - 테스트 리포트/IDE에서 계층적 표시로 의도를 더 명확히 전달. 주의사항 - JUnit 4와는 다르며, JUnit 4에서는 유사한 목적을 위해 Enclosed 같은 별도 러너를 사용했음. - 중첩이 깊어지면 테스트 이해도가 떨어질 수 있으므로 적절한 수준으로 사용. - @BeforeAll/@AfterAll 사용 시 TestInstance 설정을 고려해야 함. 요약: @Nested는 JUnit 5에서 테스트를 계층적으로 그룹화해 컨텍스트 기반 테스트를 깔끔하게 작성하도록 도와주는 어노테이션입니다.