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 , h2 및 hibernate-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 에서 찾을 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-jpa-test-in-memory-database
'Java' 카테고리의 다른 글
Hibernate Spatial 소개 (0) | 2021.04.14 |
---|---|
JPA를 사용한 저장 프로 시저 사용방법(예제) (0) | 2021.04.14 |
Spring을 사용한 JPA 사용방법(예제) (0) | 2021.04.13 |
Java Weekly, 365 호 (0) | 2021.04.13 |
스프링 컨트롤러에 대한 빠른 사용방법(예제) (0) | 2021.04.13 |