혼자 개발했던 토이 프로젝트를 리팩토링하면서 잘 작동되는 지 확인하기 위해 수차례 서버를 올렸다 내렸다를 반복했다. 이참에 테스트 코드 쓰는 방법을 공부해보기로 했다.
단위 테스트 (Unit Test) : 개별 코드 단위(클래스, 메서드)를 테스트하며, 정확한 입력 값과 출력 값을 반환하는지 확인
직접 DB에 접근하지 않고 어떻게 테스트하는 걸까?
1. Mockito를 이용해 모의 객체 생성
2. @MockBean 어노테이션을 사용해 스프링 컨텍스트에서 특정 빈을 모의 객체로 대체
3. 인 메모리 데이터베이스 사용 → 테스트 종료 시 데이터를 유지하지 않음
통합 테스트 (Integration Test) : 서로 다른 모듈들 간의 상호작용을 테스트하며, API 서버 내의 DB 호출 함수가 DB의 데이터를 잘 호출하는지 테스트
개발 환경
- Spring Boot 3.2.5
- Java 17
- Gradle
클래스 별로 테스트 클래스를 만들고, 테스트 메서드를 작성 후 @Test
를 주입하면 JUnit이 @Test
가 붙은 메서드에 대해 자동으로 테스트를 실행하고 결과를 출력한다.
build.gradle에 의존성을 추가하고 재빌드 한다.
dependencies {
testImplementation "org.junit.platform:junit-platform-launcher:1.5.2"
testImplementation "org.junit.jupiter:junit-jupiter:5.5.2"
testImplementation "org.mockito:mockito-core:3.12.4"
}
test {
useJUnitPlatform()
}
@Mock
: 테스트 대상 객체가 의존하는 다른 객체들을 대체하기 위해 사용@InjectMocks
: 테스트 대상 객체에 주입 되는 의존성을 테스트MockitoAnnotations.openMocks(this)
Given-When-Then 패턴으로 테스트 코드를 작성하면 논리적으로 구조화해 가독성을 높이고, 테스트의 의도를 파악하기 쉽다.
req
준비result
에 담음result
이 "success"와 같은지 검증@Test
: 테스트 메서드 표시@DisplayName
: 테스트 이름 지정when
: 테스트 대상 메서드 지정thenReturn
: 반환 값 설정assertEquals
: signUp이 반환한 결과가 예상한 것과 같은지 확인verify
: 특정 매개변수로 호출된 횟수 확인