@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
'Programming > Study' 카테고리의 다른 글
헥사고날 아키텍처 얕게 공부한 뒤 느낀점 - 기본이나 잘하라 (1) | 2023.12.11 |
---|---|
임피던스 불일치 문제 해결을 위한 생각 + 현재 코드 개선할 점 찾기 (1) | 2023.12.09 |
@BeforeEach vs @BeforeAll - 한 테스트 클래스에 여러 개의 테스트가 있으면 반드시 동시에 돌려봐야 하는 이유 / @TestInstace (2) | 2023.12.08 |
테스트를 실행은 하고 싶은데 빌드에서는 제외하고 싶을 때 (1) | 2023.12.07 |
Spring Security의 인증 처리 흐름 (0) | 2023.12.06 |
댓글