@DataJpaTest
- JPA 애플리케이션을 테스트 할 때 사용하는 애노테이션
@ExtendWith(SpringExtension.class)
를 포함하고 있기 때문에 스프링 구동 환경으로 실행 되지만,@Component
나@ConfigurationProperties
빈들은 스캔되지 않아 더 빠른 테스트가 가능함@Transactional
도 포함하고 있어 기본적으로 모든 테스트 후 롤백처리 됨- 인메모리 임베디드 데이터베이스를 사용할 수도 있지만, 실제 데이터베이스를 사용하고자 한다면
@AutoConfigureTestDatabase
애노테이션을 사용할 수 있음
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class SomeRepositoryTest {
@Autowired
private SomeRepository repository;
}
@Transactional
을 사용하지 않으려면@Transactional(propagation = Propagation.NOT_SUPPORTED)
로 설정하면 된다.@DataJpaTest
는@SpringBootTest
가 아니다. 그래서 더 빠른 테스트가 가능한 것!
Querydsl
위와 같이 설정한 뒤 실행했을 때 아래와 같은 에러가 발생했다.
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.querydsl.jpa.impl.JPAQueryFactory'
Querydsl에 대한 설정으로 JPAQueryFactory
에 EntityManager
를 주입한 후 사용하고 있는데,
그 bean을 찾지 못하고 있어서 발생한다.
@Configuration
public class QuerydslConfiguration {
@PersistenceContext
private EntityManager entityManager;
/* JPAQueryFactory Bean
* 프로젝트 내에서 jpaQueryFactory 를 주입받아 사용할 수 있도록 함
* */
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
@TestConfiguration
테스트 전용 설정을 해준다. @TestConfiguration
애노테이션을 사용해 테스트 환경에서만 사용할 설정 정보를 세팅한다.@TestConfiguration
은 기본 구성 대신 직접 커스터마이즈 하여 사용할 수 있도록 한다. @TestConfiguration
이 붙은 클래스는 애플리케이션의 기본 설정을 로드할 때 사용된다.
@TestConfiguration
public class TestConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
그리고 사용할 때는 @Import
애노테이션을 이용한다.
테스트 클래스의 내부 클래스로 정의하는 것 보다, 외부에 클래스를 정의한 뒤 @Import
를 사용해 여러 클래스에서 사용하는 방법을 사용하는 게 편리하다.
@Import(TestConfig.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class SomeRepositoryTest {
@Autowired
private SomeRepository repository;
}
만약 QuerydslRepositorySupport
를 사용하지 않고 queryFactory
만 사용해서 바로 Querydsl을 사용했다면@Import
에 테스트 하고자 하는 리포지토리 클래스도 추가한다.
@Import({TestConfig.class, SomeRepository.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
public class SomeRepositoryTest {
}
'STUDY > Spring' 카테고리의 다른 글
Spring Boot | Spring Security Test @WithMockUser를 커스터마이징 해서 사용하자 (0) | 2021.09.24 |
---|---|
Spring Boot | HandlerMethodArgumentResolver로 Authentication 정보 간단하게 받기 (0) | 2021.09.24 |
JPA | Querydsl 서브 쿼리 (0) | 2021.09.07 |
Spring Boot | Querydsl Projections (0) | 2021.08.20 |
Spring Boot | PageRequest (0) | 2021.08.18 |