1. 概要

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

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

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

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の最新バージョンはMavenCentralからダウンロードできます。

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

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

@Entity
public class Student {

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

次に、Springデータ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データソースのプロパティを定義する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[のプロパティが含まれています。 X199X]データベース固有の値:

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にあります。