도서 저자님의 깃허브 주소 ( chap 4 ) : https://github.com/shinsunyoung/springboot-developer/tree/main/chapter4
Spring Boot 3 테스트 코드 & Given-When-Then & JUnit 정리
1. JUnit이란?
JUnit은 자바 단위 테스트 프레임워크로, 스프링 부트에서도 가장 많이 사용되는 테스트 라이브러리입니다.
✅ 애플리케이션의 개별 기능을 테스트하여 버그를 사전에 방지
✅ @Test 어노테이션을 사용하여 테스트 메서드 작성
✅ JUnit 5 (Jupiter) 가 기본으로 사용됨 (Spring Boot 3 기준)
2. Given-When-Then 패턴이란?
테스트 코드의 가독성을 높이는 패턴으로, BDD(Behavior Driven Development) 스타일의 테스트 작성 방식입니다.
- Given(준비) → 테스트할 데이터 및 환경 설정
- When(실행) → 실제 테스트할 동작 수행
- Then(검증) → 결과를 기대값과 비교
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class JUnitTest {
@DisplayName("1 + 2는 3이다")
@Test
public void junitTest() {
int a = 1;
int b = 2;
int sum = 3;
Assertions.assertEquals(a + b, sum);
}
@DisplayName("1 + 3는 4이다")
@Test
public void junitFailedTest() {
int a = 1;
int b = 3;
int sum = 3;
Assertions.assertEquals(a + b, sum);
}
}
✅ @BeforeAll → 모든 테스트 실행 전에 한 번만 실행 (static 메서드 필요).
✅ @BeforeEach → 각 테스트 실행 전에 매번 실행.
✅ @AfterEach → 각 테스트 실행 후에 매번 실행.
✅ @AfterAll → 모든 테스트 실행 후에 한 번만 실행 (static 메서드 필요).
import org.junit.jupiter.api.*;
public class JUnitCycleTest {
@BeforeAll
static void beforeAll() {
System.out.println("@BeforeAll");
}
@BeforeEach
public void beforeEach() {
System.out.println("@BeforeEach");
}
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
@Test
public void test3() {
System.out.println("test3");
}
@AfterAll
static void afterAll() {
System.out.println("@AfterAll");
}
@AfterEach
public void afterEach() {
System.out.println("@AfterEach");
}
}
# 제대로 테스트 코드 작성해보기
package me.shinsunyoung.springbootdeveloper;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest //테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc //MockMvc 생성 및 자동 구성
class TestControllerTest {
@Autowired
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Autowired
private MemberRepository memberRepository;
@BeforeEach // 테스트 실행 전 실행하는 메서드
public void mockMvcSetUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
.build();
}
@AfterEach // 테스트 실행 후 실행하는 메서드
public void cleanUp() {
memberRepository.deleteAll();
}
@DisplayName("getAllMembers: 아티클 조회에 성공한다.")
@Test
public void getAllMembers() throws Exception {
// given
final String url = "/test";
Member savedMember = memberRepository.save(new Member(1L, "홍길동"));
// when
final ResultActions result = mockMvc.perform(get(url) // 1
.accept(MediaType.APPLICATION_JSON)); // 2
// then
result
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id").value(savedMember.getId()))
.andExpect(jsonPath("$[0].name").value(savedMember.getName()));
}
}
어노테이션 정리
✅ @SpringBootTest → Spring Boot 컨텍스트를 로드하여 통합 테스트 실행.
✅ @AutoConfigureMockMvc → MockMvc를 자동 설정하여 웹 API 테스트 가능하도록 구성.
✅ @Autowired → 스프링 컨테이너에서 빈(Bean)을 주입.
✅ @BeforeEach → 각 테스트 실행 전 MockMvc 설정 수행.
✅ @AfterEach → 각 테스트 실행 후 memberRepository 데이터 정리(초기화).
✅ @DisplayName → 테스트의 설명을 지정하여 가독성을 높임.
✅ @Test → 해당 메서드가 JUnit 테스트 메서드임을 나타냄.
📌 추가 설명
- MockMvc → HTTP 요청을 테스트 코드에서 직접 수행할 수 있도록 해줌.
- jsonPath("$[0].id") → JSON 응답에서 특정 필드의 값을 검증.
- status().isOk() → HTTP 응답 상태가 200 OK인지 확인.
Hibernate란?
Hibernate는 Java 기반의 ORM (Object-Relational Mapping) 프레임워크입니다.
JPA(Java Persistence API)의 구현체 중 하나로, 관계형 데이터베이스(RDB)와 객체지향 프로그래밍을 쉽게 연결해 줍니다.
Hibernate의 역할
✅ 객체를 테이블과 매핑 → 엔티티 클래스를 DB 테이블과 자동으로 연결
✅ SQL 대신 HQL (Hibernate Query Language) 사용 가능
✅ 데이터베이스 독립성 보장 → 다양한 DBMS(MySQL, PostgreSQL 등)에서 동일한 코드 사용 가능
✅ 트랜잭션 관리 및 성능 최적화 지원
Hibernate vs JPA
- JPA: Java 표준 인터페이스 (Spring Data JPA에서도 사용)
- Hibernate: JPA의 대표적인 구현체
즉, JPA는 인터페이스고, Hibernate는 이를 구현한 프레임워크 중 하나입니다.
Spring Boot에서 spring-boot-starter-data-jpa를 사용하면 Hibernate가 기본적으로 설정됩니다.
'SpringBoot' 카테고리의 다른 글
스프링부트 3백앤드 개발자 되기 : 자바 편 5장 정리 (데이터베이스/ ORM) (0) | 2025.02.17 |
---|---|
스프링부트 3백앤드 개발자 되기 : 자바 편 3장 정리 (스프링부트3 구조 이해 ) (2) | 2025.02.14 |
스프링부트 3백앤드 개발자 되기 : 자바 편 2장 정리 (스프링부트3 예제) (0) | 2025.02.14 |
스프링부트 3백앤드 개발자 되기 : 자바 편 1-2장 정리 (자바 백앤드가 알아두면 좋은 지식들) (0) | 2025.02.14 |
스프링부트 3백앤드 개발자 되기 : 자바 편 1장 정리 (스프링부트 환경 세팅) (0) | 2025.02.14 |