유닛 테스트를 만드려고 하고 있다.
처음엔 이런식으로 테스트를 만들었다.
https://gist.github.com/zhy2on/f0ae304f951bcdd53420cf584a2e9003
그런데 이 코드는 테스트가 예상한 대로 잘 작동하긴 하는데 다른 데서 본 테스트 코드들을 참고하려고 @WebMvcTest를 사용하면 오류가 났다.
알고 보니 위처럼 일반 단위 테스트를 만들면 Spring Context를 전혀 사용하지 않게 되는 거고 @WebMvcTest는 Spring 컨텍스트를 사용하게 되는 거였다.
실제 애플리케이션 환경과 유사하게 테스트를 하려면 @WebMvcTest를 써야할 것 같다.... 근데 오류가 대체 어디서 나는 걸까..
@WebMvcTest와 일반적인 단위 테스트(예: @Mock과 @InjectMocks를 사용한 테스트)의 차이점
@WebMvcTest: 웹 계층만을 테스트 한다. 전체 Spring 애플리케이션 컨텍스트를 로드하지 않고, MVC 관련 컴포넌트만 로드한다
.
일반 단위 테스트: 특정 클래스
나 메서드
의 동작만을 격리하여 테스트한다.
@WebMvcTest: 제한된 Spring MVC 인프라를 설정한다. 이는 실제 애플리케이션 환경과 더 유사
하다.
일반 단위 테스트: Spring 컨텍스트를 전혀 사용하지 않는다
.
@WebMvcTest: Spring의 의존성 주입을 사용
. @MockBean을 통해 필요한 빈들을 모의 객체로 대체할 수 있다.
일반 단위 테스트: Mockito의 @Mock과 @InjectMocks를 사용하여 수동으로 의존성을 주입.
@WebMvcTest: MockMvc
를 사용하여 실제 HTTP 요청을 시뮬레이션
한다.
일반 단위 테스트: 컨트롤러 메서드를 직접 호출
한다.
@WebMvcTest: HTTP 응답, 상태 코드, 헤더
등을 검증할 수 있다.
일반 단위 테스트: 반환된 객체나 예외를 직접 검증
한다.
@WebMvcTest: 일부 Spring 컨텍스트를 로드하므로 실행 시간이 일반 단위 테스트 보다는 더 길다. (대신 @SpringTest 보다는 빠름)
일반 단위 테스트: 매우 빠르게 실행된다.