OAuth를 이용한 소셜 로그인 기능 추가 후 Controller 부분 테스트 코드가 작동하지 않았다.
CustomOAuth2UserService를 생성하는데 필요한 소셜 로그인 관련 설정값들이 테스트 코드에는 들어있지 않기 때문에 발생하는 문제인 듯 했다.
그래서 src/test/resources/application.properties 경로로 파일을 생성해 주고 테스트용 OAuth 설정값들을 넣어주었다.
spring.jpa.show_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.h2.console.enabled=true
spring.session.store-type=jdbc
# Test OAuth
spring.security.oauth2.client.registration.google.client-id=test
spring.security.oauth2.client.registration.google.client-secret=test
spring.security.oauth2.client.registration.google.scope=profile,email
그런데 아래와 같은 에러 메시지가 떴다. 분명 참고하는 책에서는 이 방식으로 해결이 되는 것으로 나와 있었는데..
JPA metamodel must not be empty!
에러 메시지를 잘 찾아보니 이 부분이 핵심인 듯 했다.
@WebMvcTest는 MVC를 위한 테스트 어노테이션으로, 웹에서 테스트 하기 힘든 컨트롤러를 테스트하는 데 적합하다.
@Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, HandlerInterceptor, WebMvcConfigurer, HandlerMethodArgumentResolver
이렇게 제한된 내용으로 가볍게 테스트 할 수 있다는 점이 장점이다.
하지만, 에러 메시지에서 알려주고 있는 바와 같이 JPA관련된 기능이 없기 때문다.
@Repository, @Service, @Component는 스캔 대상이 아니라는 뜻이다. 따라서 SecurityConfig를 생성하는데 필요한 CustomOAuth2UserService는 읽을 수가 없었던 것이다.
저 부분이 be empty되지 않도록 설정을 추가적으로 해주어야 하는 것 같았다.
테스트코드 클래스에 @MockBean(JpaMetamodelMappingContext.class)를 추가해 JPA metamodel 역할을 할수 있게 해주면 된다. 다만, 이 방법은 테스트 클래스마다 입력을 해주어야 한다.
아니면 @EnableJpaAuditing을 따로 분리해주어도 되는 듯 하다.
나는 매 테스트마다 코드를 추가해주는 것 보다는 2번으로 해결하고자 했다.
우선 Application.java 파일에 있는 @EnableJpaAuditing을 삭제해 주었다. 그리고 config 패키지에 JpaConfig를 생성해 따로 분리해 주었다. 그 결과 아래와 같이 테스트가 통과 되었다!