[그림일기 서비스 보고 공부하기] 일반 단위테스트 vs @WebMvcTest

오젼·2024년 9월 25일
0

유닛 테스트를 만드려고 하고 있다.
처음엔 이런식으로 테스트를 만들었다.

https://gist.github.com/zhy2on/f0ae304f951bcdd53420cf584a2e9003

그런데 이 코드는 테스트가 예상한 대로 잘 작동하긴 하는데 다른 데서 본 테스트 코드들을 참고하려고 @WebMvcTest를 사용하면 오류가 났다.

알고 보니 위처럼 일반 단위 테스트를 만들면 Spring Context를 전혀 사용하지 않게 되는 거고 @WebMvcTest는 Spring 컨텍스트를 사용하게 되는 거였다.

실제 애플리케이션 환경과 유사하게 테스트를 하려면 @WebMvcTest를 써야할 것 같다.... 근데 오류가 대체 어디서 나는 걸까..

@WebMvcTest vs 일반적인 단위 테스트

@WebMvcTest와 일반적인 단위 테스트(예: @Mock과 @InjectMocks를 사용한 테스트)의 차이점

테스트 범위

@WebMvcTest: 웹 계층만을 테스트 한다. 전체 Spring 애플리케이션 컨텍스트를 로드하지 않고, MVC 관련 컴포넌트만 로드한다.

일반 단위 테스트: 특정 클래스메서드의 동작만을 격리하여 테스트한다.

Spring 컨텍스트

@WebMvcTest: 제한된 Spring MVC 인프라를 설정한다. 이는 실제 애플리케이션 환경과 더 유사하다.

일반 단위 테스트: Spring 컨텍스트를 전혀 사용하지 않는다.

의존성 주입

@WebMvcTest: Spring의 의존성 주입을 사용. @MockBean을 통해 필요한 빈들을 모의 객체로 대체할 수 있다.

일반 단위 테스트: Mockito의 @Mock과 @InjectMocks를 사용하여 수동으로 의존성을 주입.

요청 처리

@WebMvcTest: MockMvc를 사용하여 실제 HTTP 요청을 시뮬레이션한다.

일반 단위 테스트: 컨트롤러 메서드를 직접 호출한다.

검증

@WebMvcTest: HTTP 응답, 상태 코드, 헤더 등을 검증할 수 있다.

일반 단위 테스트: 반환된 객체나 예외를 직접 검증한다.

성능

@WebMvcTest: 일부 Spring 컨텍스트를 로드하므로 실행 시간이 일반 단위 테스트 보다는 더 길다. (대신 @SpringTest 보다는 빠름)

일반 단위 테스트: 매우 빠르게 실행된다.

0개의 댓글