-
[Test] Interceptor 적용 후 기존 컨트롤러 테스트 깨짐개발 지식/Test 2024. 1. 10. 11:34
에러 로그
Parameter 0 of constructor in com.example.workingbook.interceptor.WebMvcConfig required a bean of type 'com.example.workingbook.device.repository.DeviceRepository' that could not be found.
- 로그를 봤을 때 해당 인터셉터를 등록하는 설정 파일에서 DeviceRepository를 사용하고 있는데 컨트롤러 테스트에서 사용하는 @WebMvcTest에는 Repository 계층의 빈들은 등록하지 않기 때문에 발생한 문제이다.
해결 방법
1. 해당 인터셉터를 MockBean으로 대체
- 아예 인터셉터가 동작하지 않게 적용
- 이렇게 하는 경우 원래의 인터셉터가 그대로 동작하게 된다. 그 이유는 WebMvcConfig에서 new 키워드를 통해 인터셉터를 생성하고 있기 때문에 스프링 빈으로 인터셉터가 직접 등록되는 방식이 아니며 따라서 MockBean으로 대체되지 않는다.
여기에서도 인터셉터가 동작되지 않게 하는 방법으로 두 가지 방법이 있다.
- WebMvcConfig를 MockBean으로 대체
- 여기에서는 이 방법을 선택하였음.
- HandleDeviceIdInterceptor를 빈으로 등록 후 MockBean으로 대체
- HandleDeviceIdInterceptor를 빈으로 등록
- MockBean 주입 시 반드시 상위 인터페이스 타입으로 주입하여야 한다.
2. 인터셉터 동작에 맞게 컨트롤러 테스트를 수정
- mockMvc 요청 헤더에 deviceId를 넣고 deviceRepository의 findById 메서드만 given을 통해서 대체하는 방식으로 적용
- 실제로 인터셉터가 동작함을 확인할 수 있다.
- 컨트롤러의 기능만을 테스트하기 위해서는 인터셉터도 MockBean으로 대체하는 방법이 맞는 것 같다. @SpringBoot를 이용한 통합 테스트에서 이 방식을 사용하는 것이 좋을 듯 하다.
결론
WebMvcConfig를 MockBean으로 추가하여 인터셉터가 동작하지 않도록 하는 방법을 적용하는 것이 컨트롤러만 테스트하는 슬라이스 테스트에 더 적합하다고 판단하여 해당 방법을 적용하였다. 추후에 모든 컨트롤러 테스트에 전역적으로 해당 설정을 적용하는 방식을 사용하는 것이 더 좋을 것 같다.
'개발 지식 > Test' 카테고리의 다른 글
[Test] 스프링 부트에서 TestEntityManager를 이용하여 JPA 테스트 하는 방법 (0) 2023.11.28 [Test] 테스트 코드 디버깅 하기 (2) 2023.11.23 [Test] @WebMvcTest 에서 403 에러 해결하기 (0) 2023.11.23