Spring Boot JUnit5 자주 사용되는 어노테이션 정리
JUnit5 테스트 시 사용하는 어노테이션 및 부가 기능에 대해 간략히 정리한다
@DisplayName
테스트 이름 명시
- 어떤 테스트를 의미하는지 테스트명 결정
@SpringBootTest vs @WebMvcTest
통합 테스트와 웹 레이어 기반 단위 테스트
@SpringBootTest
- 목적 :
애플리케이션 전체 컨텍스트 로드
후통합 테스트
수행 - 테스트 범위 : 애플리케이션 전체 컨텍스트 로드하기에, DB, 서비스 계층, 리포지토리, 보안 등 모든 빈을 포함한 전체 테스트 수행 가능
- 장점 : 애플리케이션 실제 실행되는 환경과 동일한 환경 테스트 가능
- 단점 : 테스트 시간이 길어짐, 모든 컨테스트 로드 하기에
- 목적 :
@WebMvcTest
- 목적 :
MVC (Controller) 계층
만테스트
하기 위해 사용 - 테스트 범위 :
웹 계층
(Controller
)Bean만 로드
,서비스, 리포지토리, DB 관련 빈은 로드 안됨
+ HTTP 요청 및 응답 테스트 - 장점 : 필요한 빈만 로드하기에 테스트 실행이 빠름 + 단위 테스트와 비슷한 방식의 테스트 가능
- 단점 : 애플리케이션 전체 동작 테스트 불가능 + 웹 계층만 테스트 가능
- 목적 :
@ContextConfiguration(classes = { ShopApplication.class })
@ContextConfiguration(classes = 클래스 이름.class)
@ContextConfiguration(locations = "파일의 경로")
Spring F/W에서 사용되는 어노테이션으로, 테스트 클래스가 사용할 Application Context 클래스 지정
- JUnit5 테스트 클래스가 사용할, Application Context 설정
- Application Context의 파일 혹은 클래스 위치 지정
- @SpringBootApplication 클래스 경로 지정 이유?
- 위 어노테이션을 사용한 클래스는 기본적으로 컴포넌트 스캔, Spring 빈 등록, 자동 설정 등의 중요한 설정을 포함하기에
- 해당 어노테이션 붙은 클래스가 진입점이자 전체 컨텍스트를 구성하는 핵심 역할을 담당
- 하여 위 클래스를 지정하면 필수 설정이 자동 로드 됨
@WithMockUser
@WithMockUser(username = "admin", password = "admin1234!")
- Spring Security에서 제공되는 어노테이션
테스트 환경
에서가상의 인증된 사용자
(Mock User)를생성
하여테스트 가능
하게 만들어줌
@ExtendWith
확장 기능 추가
- 단위 테스트 or 통합 테스트 시에 사용할 확장 기능 추가
- 생명주기 관리(테스트 라이프사이클 관리 or 후킹)
- 테스트 실행 전후 or 클래스 인스턴스화 전후 등 다양항 지점에서 동작 추가 가능
- 의존성 주입(DI)
- 테스트 메서드, 클래스, 인자에 DI를 수행할 수 있다
@ExtendWith(SpringExtension.class)
- SpringExtenstion은 JUnit5와 Spring 프레임워크를 연결하는 확장 기능
- JUnit5의 다른 확장 기능과 다르게, Spring이 제공하는 모든 테스트 기능 사용 가능
- Spring 컨테스트 통합
- JUnit 테스트에서 Spring Application Context를 로드 및 관리
- 의존성 주입(DI) 활성화
- @Autowired 등을 사용해 Spring Bean 주입 가능
- Spring 기능 사용
- 트랜잭션 관리, DB와 통합된 테스트, Spring Security 설정 등등
@ExtendWith(MockitoExtension.class)
- JUnit5에서 Mockito의 확장 기능 적용
- @Mock, @InjectMock, @Spy 등의 어노테이션 자동 처리(Mock 객체 자동 초기화 및 주입)
- 테스트 라이프사이클 관리
- 테스트 메서드 실행 전후 필요한 설정 및 정리 작업 자동 수행
- 예를 들어, @InjectMocks이 달린 객체의 의존성 주입 + 객체 초기화 자동 수행
@TestInstance(TestInstance.Lifecycle.옵션)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class TestInstanceAnnotation {
public int i=0;
@Test // 1번 테스트 객체 생성
void test_1() {
assertTrue(++i == 1);
}
@Test // 2번 테스트 객체 생성
void test_2() {
assertTrue(++i == 1);
}
}
- JUnit은 설정된
테스트 단위
로테스트 객체를 생성
, 이를테스트 인스턴스
라 지칭 - 즉,
기본적으로 Test 메서드 단위로 객체를 생성
- TestInstance
기본 라이프 사이클 옵션
은PER_METHOD
- 만약
테스트 메서드간에 영향이 가는 테스트
를 할때는 위 옵션을PER_CLASS
로 변경 해야 함
@TestMethodOrder
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestMethodOrder 선언하지 않으면 기본 알고리즘에 의해 순서가 결정됨
테스트 메서드의 실행 순서가 보장
되어야 한다면,@TestMethodOrder
를 사용해야 한다- 옵션 타입
- MethodName: 메서드명
- DisplayName: @DisplayName
- OrderAnnotation: @Order(n)
- Random: 랜덤
99. 참고 자료
'Spring MVC > Spring MVC - Experience' 카테고리의 다른 글
[Spring] Spring @Scheduled 스케줄러 간단히 사용 해보기 (0) | 2025.01.07 |
---|