개발바닥곰발바닥
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);
	}
}

 

참고

https://jyami.tistory.com/124

728x90
profile

개발바닥곰발바닥

@bestinu

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!