Skip to content

test comparison

doplinBlue edited this page May 9, 2025 · 5 revisions

현업에서 가장 자주 쓰는 Spring 테스트 TOP 3

  1. 단위 테스트 (Mockito 기반)Service 계층 테스트
  2. 슬라이스 테스트 (@DataJpaTest)Repository 계층 검증
  3. 통합 테스트 (@SpringBootTest) → 전체 흐름 검증

1. 🧪 단위 테스트 (Service 계층, Mockito 사용)

비즈니스 로직만 검증하고, Repository는 모킹(mock)으로 처리해 외부 의존성 제거.

코드 예시:

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;

@InjectMocks
private UserService userService;

@Test
void 사용자명으로_조회하면_정상적으로_리턴된다() {
    // Given
    String username = "testuser";
    User user = new User(username, "test@example.com");
    when(userRepository.findByUsername(username)).thenReturn(Optional.of(user));

    // When
    UserDto userDto = userService.findUserByUsername(username);

    // Then
    assertThat(userDto.getUsername()).isEqualTo("testuser");
    verify(userRepository).findByUsername(username); // 호출 여부 검증
}

}


2. 🗃 슬라이스 테스트 (@DataJpaTest)

사용 목적:

JPA Repository에서 JPQL/쿼리 동작이 잘 되는지 빠르게 검증.

코드 예시:

@DataJpaTest
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;

@Test
void 사용자명을_기반으로_조회할_수_있다() {
    // Given
    User saved = userRepository.save(new User("testuser", "test@example.com"));

    // When
    Optional<User> found = userRepository.findByUsername("testuser");

    // Then
    assertThat(found).isPresent();
    assertThat(found.get().getEmail()).isEqualTo("test@example.com");
}

}


3. 🌐 통합 테스트 (@SpringBootTest)

사용 목적:

Controller → Service → Repository 전체 흐름을 실제처럼 테스트.

REST API 전체 동작도 같이 확인 가능.

코드 예시:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;

@Autowired
private UserRepository userRepository;

@BeforeEach
void setup() {
    userRepository.save(new User("testuser", "test@example.com"));
}

@Test
void 사용자명으로_사용자정보_API_조회() throws Exception {
    mockMvc.perform(get("/api/users/testuser"))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.username").value("testuser"))
        .andExpect(jsonPath("$.email").value("test@example.com"));
}

}


📝 결론

테스트 주 대상 특징 실제 현업 사용도
단위 테스트 (Mockito) Service 빠르고 독립적 ⭐⭐⭐⭐
슬라이스 테스트 (@DataJpaTest) Repository 쿼리 검증에 최적 ⭐⭐⭐⭐
통합 테스트 (@SpringBootTest) 전체 흐름 전체 연동 확인 ⭐⭐⭐

Clone this wiki locally