본문 바로가기

Study Information Technology

Spring Boot 테스트 기능 단위 테스트와 통합 테스트

728x90
반응형

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());
}
}

이 예제에서는 UserServiceUserRepository를 호출하여 특정 사용자를 찾는 기능을 테스트합니다. 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는 강력한 테스트 기능을 제공하여 애플리케이션의 품질을 보장하는 데 큰 도움을 줍니다. 단위 테스트와 통합 테스트를 적절히 활용하면 코드의 신뢰성을 높이고, 배포 후 발생할 수 있는 문제를 사전에 예방할 수 있습니다. 테스트를 통해 모든 컴포넌트가 의도한 대로 작동하는지 확인하고, 버그를 조기에 발견하여 해결할 수 있는 기회를 제공합니다.

참고문서

반응형