Spring으로 단위 테스트를 진행하다보면 비슷한 관심사를 가진 코드가 보인다. 똑같은 기능을 하지만 결과가 성공/실패, 같은 실패지만 다른 Exception을 던지는 test code들이 그렇다.
JUnit5에선 @Nested
를 이용해 Inner Class로 비슷한 함수를 묶어주면서 계층적 Test를 제공해 위 문제를 해결한다.
JUnit5 User Guide - Nested Test 부분
@Nested tests give the test writer more capabilities to express the relationship among several groups of tests. Such nested tests make use of Java’s nested classes and facilitate hierarchical thinking about the test structure.
이처럼 @Nested
가 나오기 전에는 test 코드들이 많아 질수록 가독성이 안좋아지고 비슷한 테스트가 여기저기 흩어져 있는 경우도 많았다.
public class DisplayNameTest {
@Test
public void testAsuccess() { /* */ }
@Test
public void testAfail() { /* */ }
@Test
public void test1success() { /* */ }
@Test
public void test1success() { /* */ }
@Test
public void test2success() { /* */ }
@Test
public void test2fail() { /* */}
}
@Nested
를 사용하면 비록 코드는 길어졌지만, 같은 관심사 별로 한 번에 모아볼 수 있고 계층 구조라 훨씬 가독성이 증가했다. 추가로 Inner Class 내부에 Field 값과 @BeforeEach
를 활용하면 동일한 test를 하기 위한 동일한 초기화 및 설정을 한 번에 해줄 수 있다.
public class DisplayNameTest {
@Nested
class testA {
@Test
public void success() { /* */ }
@Test
public void fail() { /* */ }
}
@Nested
class testNumber {
@Nested
class test1 {
@Test
public void success() { /* */ }
@Test
public void fail() { /* */ }
}
@Nested
class test2 {
@Test
public void success() { /* */ }
@Test
public void fail() { /* */ }
}
}
}