본문 바로가기
Spring

Spring Jpa 테스트 H2, TestEntityManager

by 스르나 2022. 1. 20.

Spring Jpa를 테스트할 떄 사용중(운영, 개발)인 DB를 사용하기 애매할 때가 있다.

 

이럴때 사용할 수 있는 방법 2가지를 소개하려고 한다.

 

 

1. H2(Default)

첫 번쨰로 In Memory Database인 H2 데이터베이스를 사용하는 방법이다.

 

@DataJpaTest 어노테이션을 사용해서 테스트를 하면 테스트 때 참조할 DB의 디폴트가 H2 DB다.

그래서 H2 DB 의존성이 없으면 실행이 안 될 것이다(이떄는 @AutoConfigureTestDatabas(replace = Replace.NONE)을 붙혀서 사용 DB를 참조하게 하면 된다.)

 

H2 DB사용 사용 방법은 https://dongjuppp.tistory.com/68?category=886936 이 글에서 이미 설명하였다.

 

이번에는 구성을 살짝 바꿔서 했으니 바뀐 구성만 보자

 

properties, yml

# 테스트에 사용할 H2 DB 설정
database=h2
spring.sql.init.data-locations=classpath*:db/${database}/data.sql
spring.sql.init.schema-locations=classpath*:db/${database}/schema.sql

# 실제 사용할 DB 설정들
spring.jpa.hibernate.ddl-auto=none
spring.jpa.open-in-view=false

spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/employees;

spring.datasource.hikari.password=root
spring.datasource.hikari.username=root
#spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.driver-class-name=com.mysql.jdbc.Driver

 

위 설정을 보면 테스트에 사용할 H2 DB설정이 있는데 H2 DB에 사용할 DDL, DML문이 들어있는 sql파일의 위치를 지정해 준 것이다.

 

아래는 실제 운영에 사용할 DB 설정이다.

 

sql파일의 위치는 resource 밑에 db디렉토리를 만들고 그안에 data.sql, schema.sql을 넣었다.

 

H2 설정은 이게 전부이다.

 

 

@DataJpaTest
class EmployeeRepositoryTest {

    @Autowired
    EmployeeRepository employeeRepository;


    @Test
    void getEmployeeTest(){
        Employee employees = employeeRepository.getEmployeeByEmpNo(1000);
        assertThat(employees.getEmpNo()).isEqualTo(1000);
        assertThat(employees.getFirstName()).isEqualTo("choi");
    }
}

 

디폴트로 H2 DB를 사용하면 위처럼 해도 바로 테스트는 성공한다.

 

 

2. TestEntityManager

TestEntityManager는 데이터를 임시로 저장하는 방법이다.

 

H2 DB는 쉽게 구성이 가능하지만 어찌 됐든 sql문을 필요로 한다.

 

새로운 데이터를 추가로 필요로 하거나, 특별한 경우가 필요한 경우 유용하다.

 

사용 방법은 아래 코드를 보면 된다.

 

@DataJpaTest
class EmployeeRepositoryTest {

    @Autowired
    EmployeeRepository employeeRepository;

    @Autowired
    TestEntityManager testEntityManager;

    @Test
    void getEmployeeByEmpNoTest(){
        LocalDate now = LocalDate.now();
        Employee employee = Employee.builder()
                .empNo(10000)
                .birthDate(now)
                .firstName("test")
                .gender(Gender.F)
                .hireDate(now)
                .lastName("test")
                .build();

        testEntityManager.persist(employee);

        Employee result = employeeRepository.getEmployeeByEmpNo(10000);

        assertThat(result.getEmpNo()).isEqualTo(10000);
    }
}



@Entity
@Table(name = "employees")
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee {



    @Id
    @Column(name = "emp_no")
    private int empNo;

    @Column(name = "birth_date")
    private LocalDate birthDate;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "gender")
    @Enumerated(EnumType.STRING)
    private Gender gender;

    @Column(name = "hire_date")
    private LocalDate hireDate;
}

 

위에서 TestEntityManager를 Autowired로 가져와서 임시 저장할 데이터(Entity 타입이여야 한다)를 persist 메소드를 통해 임시로 저장해서 사용하였다.

'Spring' 카테고리의 다른 글

@WebMvcTest  (0) 2021.07.01
Spring Lifecycle Callback  (0) 2021.03.20
Spring 단위테스트 -2 Data  (0) 2021.02.28
Spring 단위테스트 - 1  (0) 2021.02.28
InMemory-H2  (0) 2021.02.23