Spring Boot 테스트 기능: 단위 테스트와 통합 테스트
Overview
Spring Boot는 애플리케이션의 품질을 보장하기 위해 단위 테스트(Unit Testing)와 통합 테스트(Integration Testing)를 지원하는 강력한 테스트 기능을 제공합니다. 이 글에서는 Spring Boot의 테스트 기능을 활용하는 방법, 다양한 테스트 프레임워크와의 통합, 그리고 각 테스트 유형의 구체적인 예제와 에러 처리 방법에 대해 자세히 설명하겠습니다.
1. 단위 테스트(Unit Testing)
단위 테스트는 애플리케이션의 개별 컴포넌트나 메서드가 예상대로 동작하는지 확인하는 테스트입니다. Spring Boot에서는 JUnit과 Mockito를 주로 사용하여 단위 테스트를 작성할 수 있습니다.
1.1 JUnit을 활용한 단위 테스트
JUnit은 Java에서 가장 널리 사용되는 테스트 프레임워크입니다. Spring Boot와 함께 사용할 때는 주로 @SpringBootTest
어노테이션을 사용하여 스프링 컨텍스트를 로드합니다.
예제:
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class CalculatorServiceTest {
@Autowired
private CalculatorService calculatorService;
@Test
public void testAdd() {
int result = calculatorService.add(3, 5);
assertEquals(8, result);
}
}
이 예제에서는 CalculatorService
라는 간단한 서비스를 테스트합니다. add
메서드가 3과 5를 더했을 때 결과가 8인지 확인합니다.
1.2 Mockito를 활용한 단위 테스트
Mockito는 테스트할 객체의 동작을 모의(Mock)할 수 있는 강력한 라이브러리입니다. 주로 의존성이 있는 클래스의 테스트에 사용됩니다.
예제:
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserRepository userRepository;
@Test
public void testFindUserById() {
when(userRepository.findById(1)).thenReturn(Optional.of(new User(1, "Alice")));
User user = userService.findUserById(1);
assertEquals("Alice", user.getName());
}
}
이 예제에서는 UserService
가 UserRepository
를 호출하여 특정 사용자를 찾는 기능을 테스트합니다. Mockito
를 사용하여 UserRepository
의 동작을 모의하여, 실제 데이터베이스에 접근하지 않고도 테스트를 진행합니다.
2. 통합 테스트(Integration Testing)
통합 테스트는 애플리케이션의 여러 컴포넌트가 함께 올바르게 동작하는지 검증합니다. Spring Boot에서는 @SpringBootTest
어노테이션을 사용하여 통합 테스트를 쉽게 설정할 수 있습니다.
2.1 REST API 통합 테스트
REST API의 경우, MockMvc
를 사용하여 HTTP 요청을 모의하고 응답을 검증할 수 있습니다.
예제:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Alice"));
}
}
이 예제에서는 UserController
에서 특정 사용자 정보를 가져오는 API를 테스트합니다. MockMvc
를 사용하여 HTTP GET 요청을 보내고, 응답 상태와 JSON 형식의 데이터가 예상과 일치하는지 확인합니다.
3. 에러 처리와 디버깅
테스트를 작성하다 보면 다양한 에러에 직면할 수 있습니다. 몇 가지 일반적인 에러와 해결 방법을 소개하겠습니다.
3.1 NullPointerException
테스트 중 NullPointerException
이 발생하는 경우, 주로 의존성이 주입되지 않았기 때문입니다.
해결 방법:
@InjectMocks
와@Mock
을 올바르게 설정했는지 확인합니다.- 테스트 클래스에
@BeforeEach
어노테이션을 사용하여MockitoAnnotations.initMocks(this);
를 호출해 초기화합니다.
3.2 AssertionError
테스트 결과가 예상과 다를 경우, AssertionError
가 발생할 수 있습니다.
해결 방법:
assertEquals()
와 같은 검증 구문에서 비교하는 값이 올바른지 확인합니다.- 필요한 경우
System.out.println()
을 사용하여 중간 결과를 출력해 디버깅합니다.
결론
Spring Boot는 강력한 테스트 기능을 제공하여 애플리케이션의 품질을 보장하는 데 큰 도움을 줍니다. 단위 테스트와 통합 테스트를 적절히 활용하면 코드의 신뢰성을 높이고, 배포 후 발생할 수 있는 문제를 사전에 예방할 수 있습니다. 테스트를 통해 모든 컴포넌트가 의도한 대로 작동하는지 확인하고, 버그를 조기에 발견하여 해결할 수 있는 기회를 제공합니다.
참고문서
'Study Information Technology' 카테고리의 다른 글
Spring Boot를 이용한 WebSocket 지원 실시간 통신 기능 구현하기 (0) | 2024.10.13 |
---|---|
Spring Boot와 마이크로서비스 아키텍처 통합의 이해 (0) | 2024.10.13 |
Spring Boot에서 커스텀 어노테이션 만들기 (0) | 2024.10.13 |
스프링 부트의 Scheduled 어노테이션으로 스케줄링 구현하기 (0) | 2024.10.13 |
Spring Boot와 Redis를 이용한 캐싱의 성능 향상 (0) | 2024.10.13 |