Spring Boot + MyBatisプロジェクトでMyBatisマッパークラスを単体テストする方法

2020年7月12日

Spring BootでMyBatisを使用するための設定

Spring BootプロジェクトでMyBatisを使用する際にはmybatis-spring-boot-starterを利用するとdependenciesに追加するだけで簡単に設定が完了します。

また、MyBatisのマッパーをテストするためにmybatis-spring-boot-starter-test
が用意されています。使用するためには同じくプロジェクトのdependenciesに追加するだけです。mybatis-spring-boot-starter-testではテスト時はデフォルトではH2DBを使用するので併せて追加しましょう。
build.gradleの場合以下のようになります。


dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
...
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'com.h2database:h2:1.4.197'
testCompile("org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.1.0")
}
参考情報

マッパーの単体テストクラスの作成

例として、以下のようなMyBatisマッパークラスとエンティティクラスに対してテストクラスを作成します。


@Mapper
@Repository
public interface ProductMapper {
    @Select({
    "select",
    "id, name, price, version",
    "from public.product",
    "where id = #{id,jdbcType=INTEGER}"
    })
    @ResultMap("com.example.demo.ProductMapper.BaseResultMap")
    Product selectByPrimaryKey(Integer id);
}

ProductMapper.xmlの中のResultMapは以下のように定義しています。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.ProductMapper">
    <resultMap id="BaseResultMap" type="com.example.demo.Product">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="price" jdbcType="INTEGER" property="price" />
        <result column="version" jdbcType="INTEGER" property="version"/>
    </resultMap>
...

エンティティクラスは以下のように定義しています。この例ではLombokを使用しGetter,Setterを生成しています。


//importは省略
@NoArgsConstructor
@Data
@AllArgsConstructor
public class Product {
    private Integer id;
    private String name;
    private Integer price;
    private Integer version;
}

テストクラスは以下のように作成できます。


// importは省略
@RunWith(SpringRunner.class)
@MybatisTest
public class MyBatisMapperTest {
    @Autowired
    private ProductMapper productMapper;
    @Test
    public void test1() {
        var foundProduct = productMapper.selectByPrimaryKey(1);
        assertThat(foundProduct).isNotNull();
    }
}

MyBatis GeneratorとGradleブラグインを使用するとMyBatisのマッパー、エンティティクラスを簡単に精製することができます。