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.

1. @AutoConfigureTestDatabase 설정

DB 관련 테스트를 진행할 때 테스트 DB 를 어떤 것을 사용할 것인지 설정한다. 해당 설정 덕분에 실제 어플리케이션에서 사용하는 DB 와 테스트에서 사용하는 DB 를 분리할 수 있다.

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() {

    }
}

2. classpath 설정

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) 파일을 불러온다.

요약