ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • java
  • 가상 스레드 예외 핸들링
  • AuthenticationException
  • 인가(Authorization) 처리
  • jpa
  • 트랜잭션
  • FilterSecurityInterceptor
  • restdocs enum
  • 동시성 제어
  • DataJpaTest
  • tree
  • StructuredConcorrency
  • 가상 스레드
  • nginx basic auth
  • AccessDecisionVoter 커스텀
  • nGrinder
  • restdocs custom
  • mysql
  • LocalDateTime
  • node exporter basic auth
  • 동등성
  • AccessDecisionManager
  • querydsl
  • 동일성
  • VirtualThread Springboot
  • junit5
  • 정규표현식
  • UserDetailsService
  • 구조화된 동시성
  • scope value

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

Issue

Controller + JPA, JUnit Slice Test Error [JPA metamodel must not be empty! 해결]

2022. 12. 12. 18:31

JPA + JUnit Slice Test Error [JPA metamodel must not be empty! 해결]

Controller 단위테스트를 위해 @WebMvcTest 어노테이션을 이용해서 테스트하던 중에

JPA metamodel must not be empty

라는 오류를 만났다.

JPA Audit 기능을 사용하기 위해 @EnableJpaAuditing을 추가했었는데, @SpringBootApplication 클래스에 등록해놓은 것이 에러의 원인이었다.

  • JPA metamodel must not be empty! 는 JPA 메타 모델은 비워둘 수 없다는 메시지다.

 

@WebMvcTest는 Web기능과 관련된 Bean만 등록하기 때문에 JPA 생성과 관련된 기능이 전혀 존재하지 않는 테스트 어노테이션이다.

JPA Auditing 기능을 사용할때 @SpringBootApplication에 @EnableJPaAuditing을 추가하여 사용하지 않으면 에러가 발생한다. Spring 컨테이너를 요구하는 테스트는 XXXApplication 클래스가 항상 로드되지만 Application은 로드하지 않기 때문이다.

 

해결방법

1. @MockBean 추가

테스트 코드 클래스단에 @MockBean(JpaMetamodelMappingContext.class)을 추가한다.

모든 테스트 클래스마다 입력해줘야 한다는 단점(?)이 존재한다.

@ExtendWith({SpringExtension.class, RestDocumentationExtension.class})
@WebMvcTest(UserController.class)
@MockBean(JpaMetamodelMappingContext.class)
class UserControllerTest {
    ...
}
  • 그러면 자동으로 JPA 에 대한 Context 를 넣어주므로 해결 된다.

 

2. @Configration 분리

@EnableJpaAuditing 을 적용한 Configuration Class를 따로 분리한다.

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {

}
  • 그러나 2번째 방법을 사용해서 @DataJpaTest를 테스트할 때 주의점이 있다.
  • @DataJpaTest는 Jpa에 관련된 Test에 필요한 최소한의 빈을 불러오는데, 거기에는 @Configuration 빈이 포함되어있지 않다.
  • 따라서 @Configuration을 사용하여 따로 설정 파일을 만들었을 경우 Import(JpaAuditingConfig.class)를 넣어줘야 한다.
@Import(JpaAuditingConfig.class)
@DataJpaTest
class UserRepositoryTest {

}
저작자표시 비영리 (새창열림)

'Issue' 카테고리의 다른 글

동시 삭제 요청 ObjectOptimisticLockingFailureException  (1) 2023.05.11
TransientPropertyValueException: object references an unsaved transient instance 에러  (0) 2023.01.19
AuthenticationPrincipal Null - 주입받지 못하는 이슈  (0) 2022.11.24
    'Issue' 카테고리의 다른 글
    • 동시 삭제 요청 ObjectOptimisticLockingFailureException
    • TransientPropertyValueException: object references an unsaved transient instance 에러
    • AuthenticationPrincipal Null - 주입받지 못하는 이슈
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바