Querydsl 적용한 Repository에 @DataJpaTest 적용하기
@DataJpaTest를 사용하면 Querydsl이 적용된 Repository가 @Autowired되지 않는다. 기본적으로 @DataJpaTest는 JPA와 관련한 설정만 적용해주기 때문이다.
그러나 Querydsl을 사용하면 JpaRepository에 추가적으로 @Repository 애너테이션을 이용해 Spring Bean으로 등록한 QRepository를 적용시켜줘야 한다. @DataJpaTest는 Bean등록을 하지 않기 때문에 Repository에 적용될 QRepository의 등록이 이루어지지 않고, 따라서 @Autowired도 실패하는 것이다. 그럼 Bean을 등록해주면 해결되지 않을까?
Bean 등록을 위해서는 Configuration을 이용해야 한다. 기본적으로 Spring Context에 Bean등록을 하기 위해서는 @Configuraion 애너테이션을 이용하지만, Test용 Bean을 만들기 위해서는 @TestConfiguration을 사용한다.
@TestConfiguration
public class TestConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
@Bean
public FreeBoardCustomRepositoryImpl adminRepository() {
return new FreeBoardCustomRepositoryImpl(jpaQueryFactory());
}
}
FreeBoardCustomRepositoryImpl에는 @Repository가 붙어있어 애플리케이션 실행 시에는 알아서 Bean으로 등록되지만, 테스트에서는 직접 등록해줘야한다. 이제 해당 Configuration을 @Import해주자.
@Import(TestConfig.class)
@DataJpaTest
class FreeBoardRepositoryTest {
...
}
그런데 앞으로 생길 레파지토리마다 @Import를 따로 붙이기는 좀 귀찮다. 대신 커스텀 애너테이션을 하나 만들자.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(TestConfig.class)
@DataJpaTest
public @interface RepositoryTest {
}
테스트 클래스에 붙일 것이므로 ElemenType 은 TYPE으로 설정했고, 테스트가 실행되는 동안 적용되어야 하기에 RetentionPolicy는 RUNTIME을 사용했다.
참고 자료
- 기억의 정류장님 : [QueryDsl] @DataJpaTest 에서 @Repository 테스트하기
[QueryDsl] @DataJpaTest 에서 @Repository 테스트하기
개요 프로젝트 진행중에 QueryDsl을 사용하는 CustomRepository를 만들었다. 여러 엔티티를 JOIN하여 데이터를 조회할 예정이였기 때문에 JpaRepository에 상속하지 않고 @Repository 어노테이션을 붙여 스프링
rachel0115.tistory.com