Spring

Spring 애플리케이션 테스트

Spring Framework는 강력한 테스트 지원 기능을 제공하여 애플리케이션의 품질을 보장할 수 있습니다. 이 글에서는 단위 테스트와 통합 테스트를 중심으로 Spring 애플리케이션을 테스트하는 방법을 설명하겠습니다.

9.1 단위 테스트

개념 설명

단위 테스트는 개별 클래스나 메서드를 독립적으로 테스트하는 것입니다. 이는 코드를 작은 단위로 나누어 각각의 기능이 올바르게 작동하는지 확인하는 데 사용됩니다. Spring에서는 Mockito와 같은 목(mock) 프레임워크와 함께 사용하여 단위 테스트를 쉽게 작성할 수 있습니다.

주요 컴포넌트

  • JUnit: 자바 기반의 단위 테스트 프레임워크입니다.
  • Mockito: 객체를 목(mock)으로 만들어주는 프레임워크입니다.
  • @Mock: Mockito에서 목 객체를 생성하는 애너테이션입니다.
  • @InjectMocks: Mockito에서 목 객체를 주입하는 애너테이션입니다.

예제 코드

서비스 클래스

@Service
public class UserService {
 
    private final UserRepository userRepository;
 
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
 
    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

설명:

  • @Service: 이 클래스가 서비스 레이어의 빈임을 나타냅니다.
  • UserRepository를 주입받아 사용자 데이터를 처리합니다.

단위 테스트 클래스

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
 
    @Mock
    private UserRepository userRepository;
 
    @InjectMocks
    private UserService userService;
 
    @Test
    public void testFindUserById() {
        User user = new User();
        user.setId(1L);
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));
 
        User result = userService.findUserById(1L);
        assertNotNull(result);
        assertEquals(1L, result.getId().longValue());
    }
}

설명:

  • @RunWith(MockitoJUnitRunner.class): Mockito JUnit Runner를 사용하여 테스트를 실행합니다.
  • @Mock: 목 객체를 생성합니다.
  • @InjectMocks: 목 객체를 주입하여 테스트 대상을 생성합니다.
  • @Test: 테스트 메서드를 정의합니다.
  • when(userRepository.findById(1L)).thenReturn(Optional.of(user)): userRepositoryfindById 메서드 호출 시 반환 값을 정의합니다.
  • assertNotNull(result): 결과 값이 null이 아닌지 확인합니다.
  • assertEquals(1L, result.getId().longValue()): 결과 값의 ID가 예상 값과 일치하는지 확인합니다.

9.2 통합 테스트

개념 설명

통합 테스트는 애플리케이션의 여러 구성 요소가 함께 작동하는지 확인하는 것입니다. Spring에서는 @SpringBootTest 애너테이션을 사용하여 애플리케이션 컨텍스트를 로드하고, 통합 테스트를 쉽게 작성할 수 있습니다.

주요 컴포넌트

  • @SpringBootTest: 전체 애플리케이션 컨텍스트를 로드하여 통합 테스트를 실행하는 애너테이션입니다.
  • @MockBean: Spring 애플리케이션 컨텍스트에서 목 빈을 생성하는 애너테이션입니다.
  • @Autowired: 테스트 대상 빈을 주입받는 애너테이션입니다.

예제 코드

리포지토리 인터페이스

public interface UserRepository extends JpaRepository<User, Long> {
}

설명:

  • JpaRepository<User, Long>: User 엔터티에 대한 기본적인 CRUD 기능을 제공하는 JPA 리포지토리입니다.

통합 테스트 클래스

@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceIntegrationTest {
 
    @Autowired
    private UserService userService;
 
    @MockBean
    private UserRepository userRepository;
 
    @Test
    public void testFindUserById() {
        User user = new User();
        user.setId(1L);
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));
 
        User result = userService.findUserById(1L);
        assertNotNull(result);
        assertEquals(1L, result.getId().longValue());
    }
}

설명:

  • @SpringBootTest: 전체 애플리케이션 컨텍스트를 로드하여 통합 테스트를 실행합니다.
  • @RunWith(SpringRunner.class): Spring JUnit Runner를 사용하여 테스트를 실행합니다.
  • @Autowired: 테스트 대상 빈을 주입받습니다.
  • @MockBean: 목 빈을 생성하여 애플리케이션 컨텍스트에 주입합니다.
  • when(userRepository.findById(1L)).thenReturn(Optional.of(user)): userRepositoryfindById 메서드 호출 시 반환 값을 정의합니다.
  • assertNotNull(result): 결과 값이 null이 아닌지 확인합니다.
  • assertEquals(1L, result.getId().longValue()): 결과 값의 ID가 예상 값과 일치하는지 확인합니다.

Spring 애플리케이션에서 단위 테스트와 통합 테스트를 작성하는 방법을 알아보았습니다. Spring의 강력한 테스트 지원 기능을 통해 애플리케이션의 품질을 높이고, 코드의 안정성을 보장할 수 있습니다.

다음 글에서는 Spring Boot를 이용한 배포와 운영에 대해 자세히 알아보겠습니다.

On this page