본문 바로가기

STUDY/Spring

JPA | @DataJpaTest

@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에 대한 설정으로 JPAQueryFactoryEntityManager를 주입한 후 사용하고 있는데,
그 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 {
}



@TestConfigration