Spring 에서 제공하는 Spring Data JPA 의 단위 테스트를 하기 위해서는 @DataJpaTest
어노테이션을 사용한다. 모든 스프링 빈을 호출하는 @SpringBootTest 를 사용해도 테스트는 가능하나, Repository 만을 테스트 하는 다에서는 과도한 설정일 수 있다. 따라서 테스트하고자 하는 JPA 의 관련 빈들만 로드하는 @DataJpaTest 를 사용한다.
@DataJpaTest
는 내부에 @Transactional
이 존재하므로 DB 테스트를 하더라도 변경사항들이 모두 롤백된다. 또한 기본적으로 In-Memory DB 를 사용하기 때문에 MySQL 보다 가벼운 테스트를 진행할 수 있다. 다만 기본 설정이 In-Memory DB 사용이더라도 내장 DB 를 사용할 경우에 설정이 필수이다. (어떤 DB 를 사용할 지에 대한 설정이 필수이다.)
내장 DB 설정없이 사용할 경우
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@DataJpaTest
class RepositoryTest {
@Test
void test() {
}
}
Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.
DB 관련 테스트를 진행할 때 테스트 DB 를 어떤 것을 사용할 것인지 설정한다. 해당 설정 덕분에 실제 어플리케이션에서 사용하는 DB 와 테스트에서 사용하는 DB 를 분리할 수 있다.
ANY
: 기본적으로 설정되어 있거나 직접 설정한 설정 모두 사용 가능하다. (default)AUTO_CONFIGURED
: 기본적으로 설정되어 있는 데이터소스가 있을 경우 해당 설정을 사용한다.NONE
: 어플리케이션의 기본 데이터소스 설정을 사용한다.import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
class RepositoryTest {
@Test
void test() {
}
}
application.properties
spring.datasource.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.hbm2ddl.auto=create
RepositoryTest.java
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.TestPropertySource;
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@TestPropertySource(locations = "classpath:application.properties")
@DataJpaTest
class RepositoryTest {
@Test
void test() {
}
}
이 테스트만을 위한 DB 설정이 필요할 경우 DB 설정이 담긴 properties(또는 yml) 파일을 불러온다.