728x90
Querydsl을 사용하면서 CustomRepository를 만들고 테스트할 때, @DataJpaTest 에서 테스트 코드 실행 시 아래와 같은 오류가 발생할 수 있다.
java.lang.IllegalStateException: Failed to load ApplicationContext
...
Error creating bean with name 'projectRepositoryImpl' defined in file
이는 SpringBootTest에서는 모든 빈이 주입이 되기 때문에 문제가 없지만 DataJpaTest의 경우는 QueryFactory Bean이 주입되지 않아서 발생한다.
이를 해결하기 위해서는 TestConfiguration에서 테스트 환경을 위한 Bean을 생성해주면 된다.
TestConfig
TestConfig 파일에서 JPAQueryFactory를 Bean으로 등록시킨다. 이 때 TestConfig 파일은 test 디렉터리 안에 있어야 @TestConfiguration 어노테이션을 사용할 수 있다.
@TestConfiguration
public class TestConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
RepositoryTest
테스트 코드에서는 @Import 어노테이션을 통해 위에서 생성한 TestConfig 클래스를 Import 해준다.
이후로는 @DataJpaTest 에서도 QueryFactory Bean이 주입되므로 테스트 코드가 정상적으로 작동한다.
@DataJpaTest
@TestPropertySource(locations="classpath:application-test.properties")
@Import(TestConfig.class)
class ProjectRepositoryTest {
@Autowired
private ProjectRepository projectRepository;
@Test
@DisplayName("프로젝트 태그 검색 테스트")
public void searchProjectTag() {
createProjects();
PageRequest pageRequest = PageRequest.of(0, 5, Sort.by("createdDate"));
Page<Project> projects = projectRepository.findPageByTagName("Test", pageRequest);
assertThat(projects.getContent().size()).isEqualTo(5);
assertThat(projects.getTotalElements()).isEqualTo(10);
}
}
참고
728x90
'JAVA > Spring' 카테고리의 다른 글
JPA 및 Hibernate의 1차 캐시 (0) | 2023.01.10 |
---|---|
JPA 영속성 컨텍스트와 엔티티 생명주기 (0) | 2023.01.08 |
Servlet과 ServletContainer (0) | 2022.11.03 |
Spring Data JPA 원하는 필드만 Select하기(Projection) (0) | 2022.10.29 |
[Spring] GlobalExceptionHandler와 Custom Exception으로 전역 예외처리하기 (0) | 2022.10.26 |