보통은 클래스를 분리해서 테스트를 진행하나, 일부의 테스트의 경우 테스트 간의 관계를 표현하기 위해서 중첩 클래스를 이용하는 경우가 있습니다. 이런 경우에 '@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)'를 이용하시면 됩니다.
'JAVA > JUnit' 카테고리의 다른 글
[JUnit5] 테스트 작성(7) - 반복 테스트 (@RepeatedTest) (0) | 2021.10.12 |
---|---|
[JUnit5] 내부동작(1) - 생성자와, 메서드의 매개변수 (0) | 2021.10.12 |
[JUnit5] 테스트 작성(5) - 라이프사이클과 테스트 순서(Order) (0) | 2021.10.12 |
[JUnit5] 테스트 작성(4) - Tag (0) | 2021.10.08 |
[JUnit5] 테스트 작성(3) - Assumptions와 테스트 필터링 (0) | 2021.10.08 |