자바칩

[Spring] @RunWith/@ExtendWith 와 @WebMvcTest 의 차이점 본문

Study/Spring

[Spring] @RunWith/@ExtendWith 와 @WebMvcTest 의 차이점

아기제이 2024. 7. 19. 03:24
728x90

@RunWith(MockitoJUnitRunner.class)

  • JUnit5부터는 @RunWith 대신 @ExtendWith 사용
  • 목적: Mockito를 사용하여 단위 테스트를 수행하기 위해 사용됩니다.
  • 기능: MockitoJUnitRunner는 Mockito 어노테이션(@Mock, @InjectMocks)을 처리하고, 테스트 클래스에서 목(mock) 객체를 생성하고 주입하는 기능을 제공합니다.
  • 사용 위치: 보통 서비스 클래스나 리포지토리 클래스와 같은 비즈니스 로직을 테스트할 때 사용합니다.
 
    @RunWith(MockitoJUnitRunner.class)
    public class UserServiceTest {
        @InjectMocks
        private UserService userService;

        @Mock
        private UserRepository userRepository;

        @Mock
        private PasswordEncoder passwordEncoder;

        // 테스트 메서드들...
    }
 

 

여기서는 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)을 테스트하는 데 필요한 최소한의 설정을 제공합니다. 이 어노테이션은 컨트롤러와 관련된 빈만 로드하고, 웹 환경에서의 테스트를 지원합니다.
  • 사용 위치: 주로 컨트롤러를 테스트할 때 사용합니다. 웹 요청과 응답, 컨트롤러 메서드의 동작 등을 검증합니다.
 
    @WebMvcTest(UserController.class)
    public class UserControllerTest {
        @Autowired
        private MockMvc mockMvc;

        @MockBean
        private UserService userService;

        // 테스트 메서드들...
    }
 

 

여기서는 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의 구성 요소인 컨트롤러를 테스트하기 위해 사용한다고 한다.