[Spring Boot] JUnit & Mockito를 활용한 SpringBoot 애플리케이션 테스트

손은실·2024년 5월 23일
0

Spring Boot

목록 보기
10/13

혼자 개발했던 토이 프로젝트를 리팩토링하면서 잘 작동되는 지 확인하기 위해 수차례 서버를 올렸다 내렸다를 반복했다. 이참에 테스트 코드 쓰는 방법을 공부해보기로 했다.


테스트 코드란?

  1. 내가 무엇을 만들고 있는지 정확히 인지 : 요구 사항의 기능적인 항목들을 정리하며 문서의 역할을 수행
    • 개발자는 요구 사항을 분석해 설계 후 구현하는 일을 한다. 테스트 코드를 작성하면 요구 사항의 기능적인 항목들을 정리하며 코더 케이스를 찾을 수도 있다
  1. 리팩토링의 부담 덜기 : 코드 수정 후에 기능이 정상적으로 작동하는지 검증
  2. 의존성과 결합도가 낮은 코드 지향 : 의존성이 높은 부분을 개선해 코드 품질 향상

장점

  • 코드 품질 향상
  • 회귀 테스트
  • 문서화
  • 리팩토링 지원

단점

  • 개발 시간 증가
  • 불완전한 테스트
  • 오버 엔지니어링
  • 유지 보수 비용
  • 학습 곡선


JUnit

  • Java의 표준 테스트 프레임워크
  • Spring 프레임워크와 함께 사용하는 애플리케이션의 단위 테스트 도구

단위 테스트 (Unit Test) : 개별 코드 단위(클래스, 메서드)를 테스트하며, 정확한 입력 값과 출력 값을 반환하는지 확인

직접 DB에 접근하지 않고 어떻게 테스트하는 걸까?
1. Mockito를 이용해 모의 객체 생성
2. @MockBean 어노테이션을 사용해 스프링 컨텍스트에서 특정 빈을 모의 객체로 대체
3. 인 메모리 데이터베이스 사용 → 테스트 종료 시 데이터를 유지하지 않음

통합 테스트 (Integration Test) : 서로 다른 모듈들 간의 상호작용을 테스트하며, API 서버 내의 DB 호출 함수가 DB의 데이터를 잘 호출하는지 테스트



Mockito

  • Java 애플리케이션을 위한 모킹 프레임워크
  • 단위 테스트 작성 시 모의 (가짜) 객체를 생성해 테스트 대상 객체의 의존성 격리


테스트 케이스 작성 하기

개발 환경

  • Spring Boot 3.2.5
  • Java 17
  • Gradle

클래스 별로 테스트 클래스를 만들고, 테스트 메서드를 작성 후 @Test 를 주입하면 JUnit이 @Test 가 붙은 메서드에 대해 자동으로 테스트를 실행하고 결과를 출력한다.

JUnit5 의존성 추가

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()
}


테스트 클래스 작성

  1. 가짜 객체 생성 @Mock : 테스트 대상 객체가 의존하는 다른 객체들을 대체하기 위해 사용
    • Controller에서 Service의 메서드를 호출한다
  2. 의존성 주입 @InjectMocks : 테스트 대상 객체에 주입 되는 의존성을 테스트
    • Controller를 테스트하기 위함
  3. Mockito 어노테이션 처리 MockitoAnnotations.openMocks(this)
    • 위에서 사용한 어노테이션이 잘 주입되도록 한다.

테스트 코드 작성

Given-When-Then 패턴으로 테스트 코드를 작성하면 논리적으로 구조화해 가독성을 높이고, 테스트의 의도를 파악하기 쉽다.

  • Given : 테스트의 사전 조건 (필요한 매개변수 설정 등)
  • When : 테스트 대상의 메서드 호출
  • Then : 테스트 결과 검증 (예외 발생 유무 등)

회원가입 테스트 메서드

  • Given (사전 조건)
    • signUp 메서드에서 요구하는 매개변수 req 준비
    • signService의 signUp 메서드를 호출했을 때, "success"를 반환
  • When (메서드 호출)
    • signController의 signUp 메서드의 호출 결과를 result에 담음
  • Then (결과 검증)
    • result이 "success"와 같은지 검증
    • 메서드를 호출했을 때 1번 호출되었는지 검증(여러 번 호출되면 이상하게 동작할 수 있음)

  • @Test : 테스트 메서드 표시
  • @DisplayName : 테스트 이름 지정
  • when : 테스트 대상 메서드 지정
  • thenReturn : 반환 값 설정
  • assertEquals : signUp이 반환한 결과가 예상한 것과 같은지 확인
  • verify : 특정 매개변수로 호출된 횟수 확인

0개의 댓글