본문 바로가기

Spring

Spring Boot @DataJpaTest 사용방법

728x90
반응형

@DataJpaTest

JPA 관련 테스트 설정을 로드한다. 데이터소스 설정이 정상인지 JPA를 사용해서 생성, 수정, 삭제 등의 테스트를 할 수 있다. 실제 데이터베이스를 사용하지 않고 내장형을 사용해서 테스트할 수 있기 때문에 실제DB에 영향을 주지 않는다. 

기본적으로 임베디드 데이터베이스를 사용한다. 

 

// JPA테스트가 끝날때마다 자동으로 테스트에 사용한 데이터 롤백
@DataJpaTest
// Replace.Any를 사용하면 내장된 데이터 소스를 사용하고
// Replace.NONE을 설정하면 ActiveProfiles에 설정한 환경값에 따라 적용된다.
// spring.test.database.replace: NONE 도 가능
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE,
        connection = EmbeddedDatabaseConnection.H2)
//@ActiveProfiles("dev")
public class JpaTest {

@AutoConfigureTestDatabase 

Replace.Any를 사용하면 내장된 데이터소스를 사용한다. 

Replace.None을 설정하면 @ActiveProfiles에 설정한 프로파일 환경값에 따라 데이터 소스가 적용된다. 

 

@DataJpaTest는 JPA테스트가 끝날때마다 테스트 사용한 데이터를 롤백한다. 

@AutoConfigureTestDatabase(connection=H2) 어노테이션으로 내장DB를 선택할 수 있다.

H2, Derby, HSQL 등이 있다. 

 

Book.java

@Getter
@NoArgsConstructor
@Entity
@Table
public class Book {

    @Id
    @GeneratedValue
    private Integer               idx;

    @Column
    private String               title;

    @Column
    private LocalDateTime publishedAt;

    @Builder
    public Book(String title, LocalDateTime publishedAt) {
        this.title = title;
        this.publishedAt = publishedAt;
    }
}

 

BookRepository.java

public interface BookRepository extends JpaRepository <Book, Integer> {

}

 

JpaTest.java

@Autowired
private TestEntityManager testEntityManager;

@Autowired
private BookRepository bookRepository;


@Test
public void Book_saveTest() {
    Book book = Book.builder().title("Spring Boot Test")
            .publishedAt(LocalDateTime.now()).build();
    testEntityManager.persist(book);

    assertThat(bookRepository.getById(book.getIdx()), is(book));
}

@Test
public void Book_save_searchTest() {
    Book book1 = Book.builder().title("Spring Boot Test Search1")
            .publishedAt(LocalDateTime.now()).build();

    Book book2 = Book.builder().title("Spring Boot Test Search2")
            .publishedAt(LocalDateTime.now()).build();

    testEntityManager.persist(book1);
    testEntityManager.persist(book2);

    List<Book> bookList = bookRepository.findAll();

    assertThat(bookList, hasSize(2));
    assertThat(bookList, contains(book1, book2));
}

@Test
public void Book_save_deleteTest() {
    Book book1 = Book.builder().title("Spring Boot Test Search1")
            .publishedAt(LocalDateTime.now()).build();

    Book book2 = Book.builder().title("Spring Boot Test Search2")
            .publishedAt(LocalDateTime.now()).build();

    testEntityManager.persist(book1);
    testEntityManager.persist(book2);

    bookRepository.deleteAll();

    assertThat(bookRepository.findAll(), IsEmptyCollection.empty());
}

 

TestEntityManager는 EntiryManager의 대체재로 만들어진 테스트용으로 기본적인 JPA테스트를 할 수 있다.

(persist, flush, find)

 

- Book_saveTest() : testEntityManager로 persist()기능 테스트

- Book_save_searchTest(): Book2개 저장 후 갯수 테스트, 해당 각체가 모두 포함되어있는지 테스트

- Book_save_deleteTest(): Book2개를 저장한 후 제대로 삭제 되었는지 테스트 

 

 

참고레퍼런스

처음배우는 스프링 부트 2

http://www.yes24.com/Product/Goods/64584833

 

처음 배우는 스프링 부트 2 - YES24

★ 구현 순서에 맞춰 프로젝트를 진행하며 배우는 실전 입문서★ 이 책은 스프링 부트 입문자의 눈높이에 맞춰 스프링 부트 환경 설정부터 커뮤니티 게시판 구현까지를 다룬다. 스프링 부트의

www.yes24.com

 

728x90
반응형