21.02.25 TIL53 @WebMvcTest중 오류 바로잡기

서태욱·2022년 2월 25일
0

🔎 오늘 배운 것

발생한 이슈

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되지 않도록 설정을 추가적으로 해주어야 하는 것 같았다.

해결책

  1. 테스트코드 클래스에 @MockBean(JpaMetamodelMappingContext.class)를 추가해 JPA metamodel 역할을 할수 있게 해주면 된다. 다만, 이 방법은 테스트 클래스마다 입력을 해주어야 한다.

  2. 아니면 @EnableJpaAuditing을 따로 분리해주어도 되는 듯 하다.

나는 매 테스트마다 코드를 추가해주는 것 보다는 2번으로 해결하고자 했다.

우선 Application.java 파일에 있는 @EnableJpaAuditing을 삭제해 주었다. 그리고 config 패키지에 JpaConfig를 생성해 따로 분리해 주었다. 그 결과 아래와 같이 테스트가 통과 되었다!

profile
re:START

0개의 댓글