Spring

(Spring) 테스트 코드 작성

lastdove 2024. 10. 2. 20:58

1. 테스트 코드란?

테스트 코드는 애플리케이션의 특정 기능이 의도한 대로 동작하는지 확인하기 위한 코드입니다. Spring에서는 다양한 테스트 도구를 제공하며, 대표적으로 JUnitSpring Test가 있습니다.

2. Spring에서의 테스트 코드 구성 요소

  • JUnit : 자바 기반의 단위 테스트를 지원하는 프레임워크.
  • Mockito : 객체 지향 프로그래밍에서 모의 객체(Mock)를 활용한 테스트 지원 라이브러리.
  • Spring Test : Spring 컨텍스트에서의 테스트를 지원하는 도구.
  • @SpringBootTest : 스프링 애플리케이션 전체를 테스트하는 데 사용됩니다. 주로 통합 테스트 시 사용됩니다.

3. JUnit의 주요 어노테이션

  • @Test : 테스트 메서드를 나타냅니다.
  • @BeforeEach : 각 테스트 전에 실행되는 메서드를 정의합니다.
  • @AfterEach : 각 테스트 후에 실행되는 메서드를 정의합니다.
  • @BeforeAll : 모든 테스트 이전에 한 번 실행되는 메서드를 정의합니다.
  • @AfterAll : 모든 테스트 이후에 한 번 실행되는 메서드를 정의합니다.

4. SpringBootTest 어노테이션

  • @SpringBootTest: Spring의 전체 컨텍스트를 로드하여 통합 테스트를 수행할 수 있게 합니다.
@SpringBootTest
public class ExampleTest {

    @Test
    void contextLoads() {
        // 테스트 내용
    }
}

5. Mockito 사용법

Mockito는 의존성을 가볍게 만들어주는 Mock 객체를 생성하여 테스트에 활용합니다.

@Mock
private UserRepository userRepository;

@InjectMocks
private UserService userService;

@BeforeEach
void setup() {
    MockitoAnnotations.openMocks(this);
}

@Test
void testGetUserById() {
    when(userRepository.findById(1L)).thenReturn(Optional.of(new User(1L, "John")));

    User user = userService.getUserById(1L);

    assertEquals("John", user.getName());
}

6. 테스트 환경 설정

  • @MockBean : 실제 빈 대신 Mock 객체를 빈으로 등록하여 테스트합니다.
  • @DataJpaTest : JPA 레포지토리 계층을 테스트할 때 사용합니다.
@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    void testFindByUsername() {
        User user = userRepository.findByUsername("john");
        assertNotNull(user);
    }
}

▶ TIP & 정리

  • 테스트 코드 커버리지 : 테스트 코드의 커버리지를 높이는 것이 중요합니다. 이를 위해 다양한 케이스에 대해 테스트를 작성해보세요.
  • 테스트 코드 작성 순서 : "Given-When-Then" 패턴을 사용하면 가독성이 좋은 테스트 코드를 작성할 수 있습니다.
    • Given : 테스트의 초기 상태를 정의
    • When : 테스트하려는 동작을 정의
    • Then : 결과를 검증
  • 매개변수화된 테스트 : JUnit5에서는 @ParameterizedTest를 활용하여 매개변수화된 테스트를 작성할 수 있습니다. 이는 여러 값에 대해 동일한 테스트를 반복할 때 유용합니다.
  • Mockito의 verify 사용 : 행동 기반 검증이 필요한 경우 verify()를 활용하여 특정 메서드가 호출되었는지 확인할 수 있습니다.