자바칩
[Spring] @RunWith/@ExtendWith 와 @WebMvcTest 의 차이점 본문
@RunWith(MockitoJUnitRunner.class)
- JUnit5부터는 @RunWith 대신 @ExtendWith 사용
- 목적: Mockito를 사용하여 단위 테스트를 수행하기 위해 사용됩니다.
- 기능: MockitoJUnitRunner는 Mockito 어노테이션(@Mock, @InjectMocks)을 처리하고, 테스트 클래스에서 목(mock) 객체를 생성하고 주입하는 기능을 제공합니다.
- 사용 위치: 보통 서비스 클래스나 리포지토리 클래스와 같은 비즈니스 로직을 테스트할 때 사용합니다.
여기서는 UserService 클래스의 단위 테스트를 위해 Mockito를 사용하고 있습니다. MockitoJUnitRunner는 @Mock으로 정의된 객체들을 초기화하고, @InjectMocks로 정의된 객체에 주입합니다.
@ExtendWith(MockitoExtension.class)
주요 변경 사항
- @ExtendWith(MockitoExtension.class): JUnit 5에서는 @ExtendWith를 사용하여 확장을 지정합니다. MockitoExtension을 사용하여 Mockito를 통합합니다.
- 의존성 추가: JUnit 5와 Mockito를 함께 사용하기 위해 적절한 의존성을 추가합니다.
이 방법을 사용하면 @RunWith(MockitoJUnitRunner.class) 대신 @ExtendWith(MockitoExtension.class)를 사용하여 동일한 기능을 구현할 수 있습니다.
@WebMvcTest(XXXController.class)
- 목적: Spring MVC 구성 요소(컨트롤러)를 테스트하기 위해 사용됩니다.
- 기능: Spring의 테스트 지원을 통해 웹 계층(Controller)을 테스트하는 데 필요한 최소한의 설정을 제공합니다. 이 어노테이션은 컨트롤러와 관련된 빈만 로드하고, 웹 환경에서의 테스트를 지원합니다.
- 사용 위치: 주로 컨트롤러를 테스트할 때 사용합니다. 웹 요청과 응답, 컨트롤러 메서드의 동작 등을 검증합니다.
여기서는 UserController 클래스의 테스트를 위해 Spring의 웹 MVC 테스트 지원을 사용하고 있습니다. @WebMvcTest는 컨트롤러와 관련된 빈만 로드하고, MockMvc를 사용해 HTTP 요청 및 응답을 시뮬레이션합니다.
요약
- @RunWith(MockitoJUnitRunner.class):
- 사용 목적: Mockito를 이용한 단위 테스트.
- 주로 서비스 클래스와 같은 비즈니스 로직 테스트에 사용.
- Mockito의 어노테이션(@Mock, @InjectMocks)을 처리하여 목 객체를 생성하고 주입.
- @WebMvcTest(XXXController.class):
- 사용 목적: Spring MVC 컨트롤러 테스트.
- 웹 계층(Controller)을 테스트하는 데 필요한 최소한의 설정만 로드.
- MockMvc를 사용하여 HTTP 요청 및 응답을 시뮬레이션.
각각의 어노테이션은 그 목적에 맞게 사용되며, 올바른 테스트 환경을 구성하기 위해 중요한 역할을 합니다. 서비스 로직을 테스트할 때는 @RunWith(MockitoJUnitRunner.class)를 사용하고, 웹 계층을 테스트할 때는 @WebMvcTest를 사용하는 것이 적절합니다.
왜 Controller의 테스트 클래스는 @WebMvcTest를 사용하고 Service의 테스트 클래스는 @RunWith를 사용하는지 궁금해서 찾아보았다.
Service 테스트 클래스에서는 비즈니스 로직 테스트를 수행해야 하기 때문에 Mockito를 사용하여 단위 테스트를 수행하기 위해 사용하고,
Controller 테스트 클래스에서는 웹 요청, 응답, 컨트롤러 메서드의 동작을 검증해야 하기 때문에 Spring MVC의 구성 요소인 컨트롤러를 테스트하기 위해 사용한다고 한다.
'Study > Spring' 카테고리의 다른 글
[Spring] @MockBean (0) | 2024.07.19 |
---|---|
[Spring] @InjectMocks 와 @Mock 의 차이점 (0) | 2024.07.19 |
[Spring] 디자인 패턴 (0) | 2024.06.10 |
[Spring] 객체 지향 설계 5원칙 (SOLID) (0) | 2024.06.10 |
[Spring] 객체 지향의 4대 특성 => 캡상추다 (0) | 2024.06.10 |