본문 바로가기
Java/Spring Boot

Spring Boot Test 관련 (JUnit, Mockito, AssertJ,Spring Boot Test, Testcontainers )

by curious week 2025. 3. 31.

 

1. JUnit (Java Unit Test의 표준)

버전 JUnit 4, 5(Jupiter) 두 가지가 존재 (요즘은 5 주력)
용도 단위 테스트, 통합 테스트 등 Java 테스트 전반
대표 어노테이션 @Test, @BeforeEach, @AfterEach, @Nested, @DisplayName 등

예시 (JUnit 5)

@DisplayName("간단한 더하기 테스트")
@Test
void addTest() {
    int sum = calculator.add(2, 3);
    assertEquals(5, sum);
}

2. Mockito (Mock 객체 생성)

가짜 객체(Mock) 만들어서 서비스, 컨트롤러 단위 테스트할 때 사용
DB, 외부 API 없이도 테스트 가능
@Mock, @InjectMocks, when().thenReturn() 등 사용

예시

@Mock
private UserRepository userRepository;

@InjectMocks
private UserService userService;

@Test
void 사용자_찾기() {
    when(userRepository.findById(1L)).thenReturn(Optional.of(new User(...)));

    User result = userService.findUser(1L);
    assertEquals("홍길동", result.getName());
}

3. AssertJ (더 나은 assert 문법)

JUnit의 assertEquals(a, b) 대신
가독성 높은 문법 제공: assertThat(a).isEqualTo(b)
컬렉션, Optional, 예외 등 다양한 검증 문법 제공
assertThat(user.getName()).isEqualTo("홍길동");
assertThat(users).hasSize(3).extracting("name").contains("철수", "영희");

4. Spring Boot Test (@SpringBootTest)

전체 컨텍스트를 띄워서 진짜 실행환경에서 통합 테스트 가능
DB 연동, Security, Bean DI 등 전부 테스트 가능
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
    @Autowired
    MockMvc mockMvc;

    @Test
    void 사용자_조회_성공() throws Exception {
        mockMvc.perform(get("/api/user/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.name").value("홍길동"));
    }
}

5. Testcontainers (실제 DB 띄워서 테스트)

Docker 기반으로 PostgreSQL, Redis, Kafka 등을 테스트 시 실제 컨테이너로 실행
진짜 환경과 가장 유사한 테스트 가능
@Container
static PostgreSQLContainer<?> postgresql = new PostgreSQLContainer<>("postgres:15");

6. 기타 보조 도구들

@DataJpaTest JPA 레이어만 가볍게 테스트
@WebMvcTest 컨트롤러 단위 테스트용
@MockBean Spring DI 환경에서 Mock 객체 주입
DBUnit / Flyway 테스트용 초기 데이터 넣기
RestAssured API 응답 테스트에 특화된 도구

Spring Boot에서 자주 쓰는 테스트 의존성 (Gradle 기준)

testImplementation 'org.springframework.boot:spring-boot-starter-test' // JUnit + Mockito + AssertJ 포함
testImplementation 'org.testcontainers:junit-jupiter' // Testcontainers

실무 테스트 계층 구조

단위(Unit) 테스트 JUnit, Mockito, AssertJ DB 없이 로직만 테스트
통합(Integration) 테스트 SpringBootTest, Testcontainers 실제 DB, DI 환경 포함
API 테스트 MockMvc, RestAssured 실제 HTTP 요청/응답 테스트

 

'Java > Spring Boot' 카테고리의 다른 글

ResponseEntity  (0) 2025.05.15
Swagger와 API 명세  (1) 2025.03.31
Optional<T>  (0) 2025.03.31
JPQL과 QueryDSL  (0) 2025.03.31
JPA  (3) 2025.03.31