【MyBatis】Spring BootでMyBatisマッパを単体テストする
この記事の概要
Spring Boot + MyBatis + PostgreSQLのプロジェクトでMyBatisマッパの単体テストを作成する方法を紹介します。
この記事の内容は以下の環境で動作確認しています。
- Spring Boot 2.6.7
- Java 17
- PostgreSQL 13.0
- MyBatis-Generator-Core 1.4.1
- MyBatis-Spring-Boot-Starter 2.2.2
- mybatis-spring-boot-starter-test 2.2.2
Spring BootプロジェクトでMyBatisを使用する際にはmybatis-spring-boot-starter, mybatis-spring-boot-starter-testを利用するとSpring Boot プロジェクト中のbuild.gradleへ依存関係を追加するだけで簡単に設定が完了します。
参考情報
単体テストの構成
build.gradleに依存関係を追加します。
dependencies {
...
// MyBatis
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
// PostgreSQL
runtimeOnly 'org.postgresql:postgresql'
// MyBatisマッパのテスト用
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.2.2'
}
単体テストは以下のように作成できます。マッパの作成方法やMyBatisの設定については【MyBatis Generator 1.4.1】Spring BootでMyBatis Dynamic SQLを使用するをご参照ください。
package com.example;
// importは省略
@MybatisTest // ①
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // ②
@Sql("/BookMapperTest.sql") //③
public class BookMapperTest {
// テスト対象のMyBatisマッパ
@Autowired
private BookMapper bookMapper;
@Test
public void select_test() {
assertThat(bookMapper.selectByPrimaryKey(1).map(Book::getBookTitle).orElse("")).isEqualTo("test_book1");
}
@Test
public void count_test() {
var n = bookMapper.count(c -> c.where(categoryId, isEqualTo(2)));
assertThat(n).isEqualTo(2);
}
}
①がmybatis-spring-boot-starter-testで用意されているアノテーションです。MyBatisマッパの単体テストを作成するために使用します。mybatis-spring-boot-starter-test 2.0.1以降では@ExtendWith(SpringExtension.class)を省略可能です。@MybatisTestは@Transactionalを含んでいるので@Testを付与したテストごとにトランザクションが開始されます。
②が単体テストでPostgreSQLを使用するための設定です。デフォルトではインメモリDBを使用します。
③が単体テストで使用する初期データを投入するSQLです。必ずしも@SQLを使用する必要はありませんが、マッパのテストでマッパを使ってデータを投入するするのはテストの観点から避けました。BookMapperTest.sqlはresourcesディレクトリ内に以下のように作成しました。
insert into book
values
(1, 'test_book1', 1, '2022-05-01T12:00:00+09'),
(2, 'test_book2', 2, '2022-05-02T12:00:00+09'),
(3, 'test_book3', 2, '2022-05-03T12:00:00+09');