[Spring Boot] 단위 테스트 코드 작성 (JUnit 5)
Unit 테스트
Java에서 지원하는 JUnit 프레임워크를 이용해 단위 테스트를 실시하는 것을 Unit 테스트라고 한다.
@Test 어노테이션이 붙은 함수 및 메소드를 테스트하는 것이다.
Spring에서 단위 테스트를 하는 것은 Spring 컨테이너에 올라간 Bean들을 테스트하는 것이다.
단위 테스트를 하는 이유는 작성이 간편해 빠르게 테스트가 가능하고, 불필요한 리소스를 낭비하지 않을 수 있다.
JUnit5 어노테이션
@Test
JUnit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행되는 것을 원칙으로 한다.
따라서 테스트(메소드)마다 객체를 별도로 생성한다.
JUnit4에서는 메소드의 접근제한자를 public으로 선언해야 사용할 수 있었다.
JUnit5로 넘어온 후 접근제한자가 Default여도 된다.
@Test
void testMethod1() {
System.out.println("Test Method1");
}
@Test
void testMethod2() {
System.out.println("Test Method2");
}
@BeforeEach
@BeforeEach 어노테이션이 선언된 메소드는 @Test 메소드가 실행되기 전에 반드시 실행한다.
보통 공통으로 사용하는 코드를 @BeforeEach 메소드에 선언한다.
JUnit 4의 @Before 어노테이션과 같은 기능을 한다.
@BeforeEach
void beforeEachMethod() {
System.out.println("BeforeEach Method");
}
@BeforeAll
@BeforeAll 어노테이션이 선언된 메소드는 해당 테스트 클래스를 초기화할 때 딱 한 번만 실행한다.
메서드 시그니쳐는 static으로 선언해야한다.
@BeforeAll
static void beforeAllMethod() {
System.out.println("BeforeAll Method");
}
@AfterEach
@AfterEach 어노테이션이 선언된 메소드는 @Test 메소드가 실행되고 후 반드시 실행한다.
JUnit 4의 @After 어노테이션과 같은 기능을 한다.
@AfterEach
static void afterEachMethod() {
System.out.println("AfterEach Method");
}
@AfterAll
@AfterAll 어노테이션이 선언된 메소드는 해당 테스트 클래스 내 테스트 메서드를 모두 실행한 후 딱 한 번만 실행한다.
메서드 시그니쳐는 static으로 선언해야한다.
@AfterAll
static void afterAllMethod() {
System.out.println("AfterAll Method");
}
@Disabled
@Disabled 어노테이션이 선언된 메소드는 테스트 시 실행되지 않는다.
@Disabled 어노테이션을 사용하지 않아도 @Test 어노테이션을 주석처리하면 테스트 메서드는 실행되지 않는다.
JUnit4의 @Ignore 어노테이션과 같은 기능을 한다.
@Disabled
void disabledMethod() {
System.out.println("Disabled Method");
}
테스트 코드
매개변수로 숫자 2개를 받고 두 수를 더한 값을 리턴해주는 간단한 테스트 코드를 작성해보겠다.
TestController.java
@RestController
@RequiredArgsConstructor
public class TestController {
private final TestService testService;
@GetMapping("/test")
public int sum(int num1, int num2) {
return testService.sum(num1, num2);
}
}
TestService.java
public interface TestService {
int sum(int num1, int num2);
}
TestServiceImpl.java
@Service
public class TestServiceImpl implements TestService {
@Override
public int sum(int num1, int num2) {
return num1 + num2;
}
}
TestApplicationTests.java
@SpringBootTest
class TestApplicationTests {
@Autowired
private TestService testService;
@Test
void test() {
int result = testService.sum(1, 2);
System.out.println("sum : " + result);
}
}
테스트 결과