본문 바로가기
Today I Learned 2024. 7. 9.

(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 환경을 구분지어서 생각을 할 필요가 있다고 생각