1. 개요

이 예제에서는 테스트를 위해 메모리 내 데이터베이스에 의존하는 간단한 Spring 애플리케이션만들입니다.

표준 프로필의 경우 응용 프로그램에는 적절한 사용자 및 데이터베이스 설정과 함께 MySQL 서버를 설치하고 실행해야하는 독립형 MySQL 데이터베이스 구성이 있습니다.

애플리케이션을보다 쉽게 ​​테스트 할 수 있도록 MySQL에 필요한 추가 구성을 포기하고 대신 JUnit 테스트를 실행하기 위해 H2 인 메모리 데이터베이스를 사용합니다 .

2. Maven 의존성

개발을 위해서는 다음과 같은 의존성이 필요합니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.194</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.17.Final</version>
</dependency>

Spring-test , spring-data-jpa , h2hibernate-core 의 최신 버전은 Maven Central에서 다운로드 할 수 있습니다.

3. 데이터 모델 및 저장소

엔터티로 표시 될 간단한 Student 클래스를 만들어 보겠습니다 .

@Entity
public class Student {

    @Id
    private long id;
    
    private String name;
    
    // standard constructor, getters, setters
}

다음으로 SpringData JPA를 기반으로 저장소 인터페이스를 생성 해 보겠습니다.

public interface StudentRepository extends JpaRepository<Student, Long> {
}

이것은 Spring이 Student 객체 를 조작하기위한 지원을 생성 할 수있게 합니다.

4. 별도의 속성 소스

표준 모드 및 테스트 모드에 대해 서로 다른 데이터베이스 구성을 사용할 수 있도록 응용 프로그램의 실행 모드에 따라 위치가 다른 파일에서 데이터베이스 속성을 읽을 수 있습니다.

일반 모드의 경우 속성 파일은 src / main / resources 에 있으며 테스트 방법의 경우 src / test / resources 폴더 에있는 속성 파일을 사용 합니다 .

테스트를 실행할 때 애플리케이션은 먼저 src / test / resources 폴더 에서 파일을 찾습니다 . 이 위치에 파일이 없으면 src / main / resources 폴더에 정의 된 파일을 사용 합니다. 파일이있는 경우 테스트 경로는 기본 경로 의 파일 을 재정의합니다 .

4.1. 속성 파일 정의

MySQL 데이터 소스의 속성을 정의 하는 src / main / resources 폴더 persistence-student.properties 파일을 생성 해 보겠습니다 .

dbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/myDb
jdbc.user=tutorialuser
jdbc.pass=tutorialpass

hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=create-drop

위 구성의 경우 myDb 데이터베이스를 생성하고 tutorialuser / tutorialpass 사용자를 설정해야합니다.

테스트를 위해 메모리 내 데이터베이스를 사용하기를 원하므로 src / test / resources 폴더에 동일한 키와 H2 데이터베이스 별 값을 가진 속성을 포함 하는 동일한 이름의 유사한 파일을 생성 합니다.

jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1

hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.hbm2ddl.auto=create

우리는 구성한 H2의 메모리 라이브로 데이터베이스를 자동으로 다음 폐쇄 생성 할 때와 JVM 종료 떨어졌다.

4.2. JPA 구성

persistence-student.properties 라는 파일을 속성 소스로 검색하고 그 안에 정의 된 데이터베이스 속성을 사용하여 DataSource생성하는 @Configuration 클래스를 만들어 보겠습니다 .

@Configuration
@EnableJpaRepositories(basePackages = "com.baeldung.persistence.dao")
@PropertySource("persistence-student.properties")
@EnableTransactionManagement
public class StudentJpaConfig {

    @Autowired
    private Environment env;
    
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));

        return dataSource;
    }
    
    // configure entityManagerFactory
    
    // configure transactionManager

    // configure additional Hibernate Properties
}

5. JUnit 테스트 만들기

위에서 설명한 구성을 기반으로 StudentRepository사용하여 Student 엔티티 를 저장하고 검색하는 간단한 JUnit 테스트를 작성해 보겠습니다 .

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
  classes = { StudentJpaConfig.class }, 
  loader = AnnotationConfigContextLoader.class)
@Transactional
public class InMemoryDBTest {
    
    @Resource
    private StudentRepository studentRepository;
    
    @Test
    public void givenStudent_whenSave_thenGetOk() {
        Student student = new Student(1, "john");
        studentRepository.save(student);
        
        Student student2 = studentRepository.findOne(1);
        assertEquals("john", student2.getName());
    }
}

테스트는 완전히 독립적 인 방식으로 실행됩니다. 로그에서 볼 수 있듯이 메모리 내 H2 데이터베이스를 만들고 명령문을 실행 한 다음 연결을 닫고 데이터베이스를 삭제합니다.

INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Hibernate: drop table Student if exists
Hibernate: create table Student (id bigint not null, name varchar(255), primary key (id))
Mar 24, 2017 12:41:51 PM org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSources
INFO: HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@1b8f9e2'
Hibernate: select student0_.id as id1_0_0_, student0_.name as name2_0_0_ from Student student0_ where student0_.id=?
Hibernate: drop table Student if exists

6. 결론

이 간단한 예에서는 메모리 내 데이터베이스를 사용하여 자체 포함 테스트를 실행하는 방법을 보여주었습니다.

항상 그렇듯이 전체 소스 코드는 GitHub 에서 찾을 수 있습니다 .