Today I Learned
(24.07.09)[13주차] @DataJpaTest 슬라이스 테스트에서의 빈 등록
슬라이스 테스트 중 QueryDSL로 구현한 RepositoryCustom과 JpaRepository가 extends 된 3 Layer Architecure 의 Repository 레이어의 테스틀 위해
@DataJpaTest Annotation 을 활용하면서 발생한 이슈를 정리
@DataJpaTest에서의 빈 등록
@DataJpaTest
@ActiveProfiles("test")
public class LikeRespositoryTest {
@Autowired
private LikeRepository likeRepository;
...
이슈
- 테스트 코드에서의 검증 문제가 아닌 디버깅도 시작이 안되는 주입 단에서의 문제가 발생
- 지속적으로 Runtime시에 ApplicationContext자체가 로드가 되지 않았다는 오류가 지속적으로 발생
원인
- TestCode 의 대상은 JpaRepository와 QueryDSL 로 구현된 Custom Repository가 extends 된 Repository인 상태
- QueryDSL을 사용하기 위해서 JPAQueryFactory를 Bean 둥록해주는 Config가 등록이 되어있던 상태를 TestCode 환경에서 불러올 수 있어야한다는 것
- test 단에서 즉, Test Context의 JPAQueryFactory 빈 등록이 Application Context와 일치하지 않는 부분인 것 -> Test 클래스 안에서 작동이 되어야하는 JPAQueryFactory가 없는 = persistenceLayer 단에 존재하지 않는 = EntityManager 을 통해 JPAQueryFactory가 Bean 등록이 되지 않는 상태였던 것
해결
@TestConfiguration
public class TestConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
- Test Context에서의 JPAQueryFactory Bean 등록을 해줄 수 있도록 Application Context에서 생성한 관련 Config와 동일한 Config를 생성
- @TestConfiguration
- @Configuration과 동일하게 Bean 수동등록을 할 수 있지만, Test Context에서만 사용할 수 있는 Configuration
@DataJpaTest
@ActiveProfiles("test")
@Import(TestConfig.class)
public class LikeRespositoryTest {
@Autowired
private LikeRepository likeRepository;
...
- @Import(클래스)
- 특정 설정 클래스 = 빈등록을 시킨 Config 클래스를 넣어 추가 빈을 주입시킬 수 있는 Annotation
- 따라서 위에서는 TestConfig 에서 Bean등록시킨 JPAQueryFactory를 통해서 테스트를 진행할 QueryDSL로 구동되는 메서드를 검할 수 있는것
지금보면 매우 간단한 단계이지만, 당연히 Application 과 Test 의 Context를 그대로 가지고 온다는 것으로
인지 했다는 것에서 왔던 이슈였기 때문에
전체적인 Bean 등록의 구성을 Test와 Application 환경을 구분지어서 생각을 할 필요가 있다고 생각
'Today I Learned' 카테고리의 다른 글
(24.07.22)[15주차] MinIO 활용 정리 (0) | 2024.07.22 |
---|---|
(24.07.15)[14주차] 프로젝트 중 동시성 제어를 위한 Redisson 활용 (1) | 2024.07.15 |
(24.07.04)[12주차] Redis 강의 학습 (0) | 2024.07.04 |
(24.07.03)[12주차] QueryDSL사용을 위한 Repository 분리 (0) | 2024.07.03 |
(24.07.02)[12주차] QueryDSL의 Wildcard 와 Count (0) | 2024.07.02 |