미운 오리 새끼의 우아한 개발자되기

[Spring Boot] Cloud Native Java - Test(2) 슬라이스 - @DataJpaTest 본문

Spring & Spring Boot/Spring Boot

[Spring Boot] Cloud Native Java - Test(2) 슬라이스 - @DataJpaTest

Serina_Heo 2022. 9. 28. 15:09

@DataJpaTest 를 사용하면 스프링 데이터 JPA를 사용하는 스프링부트 애플리케이션 테스트를 편리하게 작성할 수 있고, 스프링 데이터 JPA 테스트에 사용될 내장 인메모리 데이터베이스도 제공된다. @DataJpaTest 는 스프링 데이터 JPA 리포지토리를 테스트하는 데 사용되는 클래스만 자동 설정한다. 

TestEntityManager 는 스프링 부트에서 제공해주는 편의 클래스인데 JPA의 엔티티 매니저에 테스트에서 자주 사용되는 구문과 몇 가지 유틸 메소드를 추가해서 만들어졌다. TestEntityManager 는 JPA 리포지토리 테스트에서 사용되는 컴포넌트로서 리포지토리를 사용하지 않고도 데이터 스토어에 객체를 저장할 수 있다. 아래 예제에서는 TestEntityManager 로 Account 인스턴스를 저장하고, 이 인스턴스를 accountRepository 에서 반환되는 값과 비교해서 테스트한다.

package demo.account;

import demo.customer.CustomerRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@DataJpaTest
public class AccountRespositoryTest {

    private static vinal AccountNumber ACCOUNT_NUMBER = new AccountNumber("098765432");
    
    // 애플리케이션 컨텍스트에서 AccountRepository 를 주입받는다
    @Autowired
    private AccountRepository accountRepository;
    
    // 리포지토리를 사용하지 않고 영속성을 관리할 수 있는 TestEntityManager 를 주입받는다 
    @Autowired
    private TestEntityManager entityManager;
    
    @Test
    public void findUserAccountsShouldReturnAccounts() throws Exception {
        // Account 엔티티를 인메모리 DB에 영속화 한다
        this.entityManager.persist(new Account("jack", ACCOUNT_NUMBER));
        // 영속화된 Account 엔티티를 조회한다
        List<Account> account = this.accountRepository.findAccountsByUsername("jack");
        
        assertThat(account).size().isEqualTo(1);
        Account actual = account.get(0);
        assertThat(actual.getAccountNumber()).isEqualTo(ACCOUNT_NUMBER);
        assertThat(actual.getUsername()).isEqualTo("jack");
    }
    
    @Test
    public void findAccountShouldReturnAccount() throws Exception {
        this.entityManager.persist(new Account("jill", ACCOUNT_NUMBER));
        Account account = this.accountRepository.findAccountByAccountNumber(ACCOUNT_NUMBER);
        assertThat(account).isNotNull();
        assertThat(account.getAccountNumber)).isEqualTo(ACCOUNT_NUMBER);
    }
     
    @Test
    public void findAccountShouldReturnNull() throws Exception {
        this.entityManager.persist(new Account("jack", ACCOUNT_NUMBER));
        Account account = this.accountRepository.findAccountByAccountNumber(new AccountNumber("000000000"));
        assertThat(account).isNull();
    }
}

[Reference] Cloud Native Java - Josh Long, Kenny Bastani, 책만