Controller의 테스트가 안 되는 오류
오류 발생
팀 프로젝트를 진행하던 도중 JWT + Security를 사용해서 진행하고 있었다. 그 후에 컨트롤러단의 단위테스트를 진행하려고 했는데 @WebMvcTest를 통해서 해당 컨트롤러를 지정해 시작했지만... 다음과 같은 오류가 발생했습니다.
Caused by 의 내용을 해석해 보면 securityConfig 파일에서 두 번째 빈인 JwtProvider을 찾아올 수 없다면서 해당오류가 발생했습니다..
원인 파악
그럼 왜 이문제가 발생했을까 생각해 보니 현재 사용 중인 @WebMvcTest의 어노테이션읜 웹 계층만 단독적으로 사용하기 위해서 사용하기 때문에 @Configuration,@Serivce, @Repository 등의 스프링 컨테이너의 등록한 빈을 찾아올 수가 없다, 반면 @SpringBootTest를 사용하면 되지 않냐?라고 생각할 수 있지만 @SpringBootTest를 통해서 테스트를 진행하게 되면 @WebMvcTest와는 달리 스프링의 등록된 모든 Bean을 등록하고 사용하는 과정이 추가된 느려짐을 발생할 수 있을 수 있어 통합 테스트를 하기 위해 사용하기 때문에 단위 테스트의 목적이라면 옳지 않은 테스트이다. 그래서 이문제를 해결하려면.. 직접 @MockBean으로 SecurityConfig의 의존하고 있는 빈을 등록해줘야 했다.
문제 해결
다음과 같이 현재 SecurityConfig 에는 4가 DI가 되어있다 그래서 테스트를 진행하고 있는 테스트 코드에 가서 다음과 같이 @MockBean을 통해 Mock 객체의 의존성 주입을 직접 해줬다.
이제 테스트를 실행해 주면 테스트가 성공하는 것을 볼 수 있다!!!
이렇게 테스트 코드를 작성하고 테스트를 하면서 테스트의 대한 이해가 많이 부족해서 간단한 오류도 오랫동안 붙잡고 해결한 기분이 들었다. 더욱 테스트의 대한 공부를 해야겠다고 들었다.