코딩하는 감쟈

스프링 핵심 개념원리2 본문

Back-End/spring

스프링 핵심 개념원리2

진감쟈 2025. 7. 12. 15:14

Java에서 자주 쓰는 테스트 도구

도구명 유형 주요 용도 및 설명
JUnit 5 단위 테스트 Java의 표준 테스트 프레임워크. @Test, @BeforeEach 등 사용
Mockito Mock 테스트 객체를 가짜로 만들어 외부 의존성 없이 단위 테스트 수행
AssertJ 단언(Assertion) assertThat(x).isEqualTo(y) 같은 가독성 높은 검증 문법
Spring Boot Test 통합 테스트 @SpringBootTest, @WebMvcTest 등으로 스프링 환경 테스트
Testcontainers 환경 격리 통합 테스트 Docker 기반의 실제 DB, Redis 등을 띄워 테스트 (CI/CD 친화적)
Hamcrest Matcher 라이브러리 JUnit의 assertThat()을 더 풍부하게 만드는 조건식 매칭 도구
RestAssured API 테스트 RESTful API 테스트를 코드로 수행 (JSON 응답 검사 등)
JMH 성능 벤치마크 마이크로 벤치마크 테스트. 메서드 수준 성능 측정에 특화
JaCoCo 테스트 커버리지 테스트가 실제 코드의 몇 %를 실행했는지 리포트 제공
Selenium UI/브라우저 테스트 실제 브라우저를 띄워 웹 UI 테스트 수행 (e2e 테스트 용도)

1. JUnit 5

  • 목적: 단위 테스트
  • 특징: 애노테이션 기반 테스트 (@Test, @BeforeEach, @AfterAll 등)
  • 통합 테스트, 반복 테스트, 조건부 테스트, 동적 테스트 등 지원
    @Test
    void addTest() {
      assertEquals(4, calculator.add(2, 2));
    }

    2. Mockito

  • 목적: 가짜(Mock) 객체 생성으로 외부 의존성 제거
  • 실제 DB, 외부 API 없이도 테스트 가능
    UserRepository repo = mock(UserRepository.class);
    when(repo.findById(1L)).thenReturn(Optional.of(new User("Alice")));

    3. AssertJ

  • 목적: 가독성 높은 검증 문법
  • 예: assertThat(user.getName()).isEqualTo("Alice")

    4. Spring Boot Test

  • 목적: Spring 환경 통합 테스트
  • @SpringBootTest, @WebMvcTest, @DataJpaTest 등 사용
  • 실제 ApplicationContext 로딩하여 전체 흐름 검증 가능

언제 어떤 도구를 써야 하나

테스트 목적 추천 도구
단위 테스트 JUnit 5, Mockito, AssertJ
Spring 통합 테스트 Spring Boot Test, Testcontainers
API 응답 검증 RestAssured
성능 측정 JMH
커버리지 분석 JaCoCo
UI 테스트 Selenium

AssertJ

AssertJ는 assertEquals(a, b) 같은 JUnit의 기본 assertion보다 더 자연어처럼 읽히고, 체이닝(Chaining)을 통해 복합 조건을 간결하게 검증할 수 있게 해주는 라이브러리이다.

  • org.assertj.core.api
  • 자주 쓰는 메서드
메서드 설명 예시
isEqualTo(x) 값이 x와 같은지 assertThat(a).isEqualTo(5);
isNotEqualTo(x) 값이 x와 다른지
isNull() / isNotNull() null 여부 확인
isSameAs(x) 같은 객체 참조인지
isInstanceOf(Class) 클래스 타입인지
isIn(a, b, c) 값이 이 중 하나인지 isIn("A", "B", "C")
isNotIn(...) 포함되지 않는지 확인
  • 예시
    import org.junit.jupiter.api.Test;
    import static org.assertj.core.api.Assertions.*;
    

import java.util.List;
import java.util.Map;
import java.util.Optional;

public class AssertJExampleTest {

@Test
void assertjBasicExamples() {
    // ✅ 공통 비교 메서드
    String actual = "hotpack";
    assertThat(actual).isEqualTo("hotpack");     // 값이 같은지
    assertThat(actual).isNotEqualTo("other");    // 값이 다른지
    assertThat(actual).isNotNull();              // null 아님
    assertThat(actual).isInstanceOf(String.class); // 타입 확인
    assertThat(actual).isIn("hotpack", "coolpack"); // 특정 값들 중 하나인지
    assertThat(actual).isNotIn("warm", "cold");

    // ✅ String 전용 메서드
    assertThat(actual).startsWith("hot");        // 시작 문자열
    assertThat(actual).endsWith("pack");         // 끝 문자열
    assertThat(actual).contains("tp");           // 포함 여부
    assertThat(actual).hasSize(7);               // 문자열 길이
    assertThat("").isEmpty();                    // 빈 문자열
    assertThat("hi").isNotEmpty();               // 비어있지 않음

    // ✅ 숫자
    int score = 95;
    assertThat(score).isGreaterThan(90);         // ~보다 큼
    assertThat(score).isLessThan(100);           // ~보다 작음
    assertThat(score).isBetween(90, 100);        // 범위 내
    assertThat(score).isPositive();              // 양수
    assertThat(-10).isNegative();                // 음수

    // ✅ List / Collection
    List<String> names = List.of("alice", "bob", "charlie");
    assertThat(names).hasSize(3);                // 리스트 크기
    assertThat(names).contains("bob");           // 포함 여부
    assertThat(names).doesNotContain("daniel");  // 미포함
    assertThat(names).containsExactly("alice", "bob", "charlie"); // 정확히 이 순서로 포함
    assertThat(List.of()).isEmpty();             // 빈 리스트

    // ✅ Map
    Map<String, Integer> scores = Map.of("math", 90, "eng", 85);
    assertThat(scores).containsKey("math");               // 키 존재 여부
    assertThat(scores).containsEntry("eng", 85);          // 키-값 쌍
    assertThat(scores).doesNotContainKey("science");      // 없는 키
    assertThat(scores).isNotEmpty();

    // ✅ Optional
    Optional<String> opt = Optional.of("hotpack");
    assertThat(opt).isPresent();                          // 값 존재
    assertThat(opt).contains("hotpack");                  // 특정 값 포함
    assertThat(Optional.empty()).isEmpty();               // 빈 Optional

    // ✅ 예외 검증
    assertThatThrownBy(() -> {
        throw new IllegalArgumentException("잘못된 입력");
    }).isInstanceOf(IllegalArgumentException.class)
      .hasMessageContaining("잘못된");                    // 예외 타입 및 메시지 검증
}

}

- 모두 통과하는 과정이다.

'Back-End > spring' 카테고리의 다른 글

스프링 핵심 개념원리4  (1) 2025.07.12
스프링 핵심 개념원리3  (1) 2025.07.12
스프링 핵심 개념원리1  (1) 2025.07.12
JdbcTemplate, JPA  (0) 2025.02.27
@SpringBootTest와 @Transactional  (0) 2025.02.26