インメモリデータベースを使用した自己完結型テスト

1概要

このチュートリアルでは、テスト用にインメモリデータベースに依存する簡単なSpringアプリケーションを作成します。

標準プロファイルの場合、アプリケーションはスタンドアロンのMySQLデータベース構成を持つことになります。これには、適切なユーザーとデータベースを設定した状態で、MySQLサーバーをインストールして実行する必要があります。

アプリケーションのテストを容易にするために、MySQLに必要な追加の設定を無視し、代わりにJUnitテストを実行するために H2 メモリ内データベースを使用します。

2 Mavenの依存関係

開発には、以下の依存関係が必要です。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.11.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.194</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.9.Final</version>
</dependency>

spring-test の最新バージョン、 spring-data-jpa 、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22h2%22%20AND%20g%3A%22com.h2database%22[h2]およびhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca %3A%22禁止実体管理者%22%20AND 20%%3A%22org.hibernate%22[休止状態実体管理者]はMaven Centralからダウンロードできます。

3データモデルとリポジトリ

エンティティとしてマークされる簡単な Student クラスを作成しましょう。

@Entity
public class Student {

    @Id
    private long id;

    private String name;

   //standard constructor, getters, setters
}

次に、Spring Data JPAに基づいてリポジトリインターフェイスを作成しましょう。

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

これにより、Springは Student オブジェクトを操作するためのサポートを作成できるようになります。

4個別の物件ソース

標準モードとテストモードで異なるデータベース構成を使用できるようにするために、アプリケーションの実行モードによって場所が異なるファイルからデータベースプロパティを読み取ることができます。

  • 通常モードでは、プロパティファイルは src/main/resources にあり、テスト方法では src/test/resources フォルダにあるプロパティファイルを使います。

テストを実行すると、アプリケーションは最初に src/test/resources フォルダー内のファイルを探します。ファイルがこの場所に見つからない場合は、 src/main/resources フォルダに定義されているファイルが使用されます。存在するファイルが test パスである場合は、 main パスからのファイルが上書きされます。

4.1. プロパティファイルの定義

MySQLデータソースのプロパティを定義する persrc/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 = "org.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.hiber[email protected]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. 結論

この簡単な例では、インメモリデータベースを使用して自己完結型テストを実行する方法を示しました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-jpa[GitHubについて]で見つけることができます。