JPA에 관련된 요소들만 테스트하기 위한 어노테이션으로 JPA 테스트에 관련된 설정들만 적용해준다.
메모리상에 내부 데이터베이스를 생성하고 @Entity 클래스들을 등록하고 JPA Repository 설정들을 해준다.
각 테스트마다 테스트가 완료되면 관련한 설정들은 롤백된다.
SpringBootTest에 비해 올라가는 Bean이 적어서 시간이 비약적으로 줄어드는 장점이 있다.
testRuntimeOnly 'com.h2database:h2'
@DataJpaTest는 기본적으로 H2 데이터베이스를 사용한다. 따라서 H2 데이터베이스를 gradle에 추가해줘야한다.
테스트를 돌릴 때 실제 서비스의 application.yml을 사용하면 안된다. 그렇다고 매번 수정해서 돌리기에는 번거롭고 실수가 나서 큰 실수로 이어질 수 있다.
test/resources/application.yml
스프링 부트 테스트는 우선 test/resources/application.yml을 먼저 찾고 없다면 src/resources/application.yml을 찾아서 실행시킨다. 따라서 테스트용 application.yml을 작성해주면 자동으로 해당 설정이 적용된다.
spring:
datasource :
url: jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1 //MYSQL로 테스트
driverClassName: org.h2.Driver
username: sa
password:
jpa:
hibernate:
ddl-auto: create-drop
database-platform: org.hibernate.dialect.MySQL8Dialect //MYSQL로 테스트
logging:
level:
org.hibernate.orm.jdbc.bind: trace
@DataJpaTest은 기본적으로 메모리DB를 사용하게 설정되어있다. (test전용 application.yml이 있어도.....)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
AutoConfigureTestDatabase를 설정해서 자동으로 설정이 교체되는 것을 막으면 test application.yml을 사용할 수 있다.
따라서 메모리DB로 실행되던 테스트가 test application.yml에 설정된 db로 교체되어 테스트가 진행된다.
거의 @SpringBootTest만 이용하여 테스트코드를 작성했는데 @DataJpaTest를 사용하여 유닛테스트를 작성하면 시간도 절약되고 더 좋을 것 같다!