SpringBoot でSQLをテストする(Mybatis)

エキサイト株式会社 メディア事業部エンジニアの中です。

SpringBootでmybatisで発行したSQLのテストのやり方を記載します。

H2というin-memoryデータベースを用意し、schema.sql、data.sqlの初期データを挿入してから、SQLを発行し、正しくデータが取得できているかテストをします。

ユースケース

  • SQLのテストする

前提条件

  • MybatisTestを使う
  • H2を使う

gradleに以下を追加

        testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.1.3'
        testImplementation 'com.h2database:h2:1.4.200'

入力

application.yml

  • SQL server を使用するため、ModeをMSSQLServerに設定します。
  • 細かい設定は公式サイトから参照してください。

www.h2database.com

spring:
  datasource:
    initialization-mode: always
    driver-class-name: org.h2.Driver
    url: jdbc:h2:~/test;MODE=MSSQLServer
    username: sa
    password: sa
  h2:
    console:
      enabled: true
mybatis:
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    org.springframework.jdbc: debug
    com.exblog: debug

schema.sql

CREATE TABLE user
(
    user_id  bigint IDENTITY(1,1) PRIMARY KEY,
    name NVARCHAR(20) NOT NULL
);

data.sql

INSERT INTO user VALUES (1, 'nakao');

MapperTestApplication.java

  • h2を起動させるため、テスト用にSpring Applicationの設定を追加します
  • testファイルが置いてあるパッケージに配置してください。
package com.sqlserver.mapper;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MapperTestApplication {

}

UserCustomMapper

  • SQLを実行するinterfaceとftlです。
@Mapper
public interface UserCustomMapper {
    @Lang(FreeMarkerLanguageDriver.class)
    @Select("find_user.ftl")
    UserModel getUser(
            @Param("user_id") Long userId
    );
}

find_user.ftl

select
  *
from
  user
where
  user_id = <@p name="user_id"/>

入力例

テストコードです

@ExtendWith(SpringExtension.class)
@MybatisTest
class UserCustomMapperTest {
    @Autowired
    private UserCustomMapper userCustomMapper;

    @Test
    public void findByStateTest() {
        final UserModel user = userCustomMapper.getUser(1L);
        assertTrue(user.getUserId().equals(1L));
        assertTrue(user.getName().equals("nakao"));
    }
}

出力例 デバッグモードを使うと発行したSQLの詳細が出力されます。

2021-04-29 23:39:04.683 DEBUG 4206 --- [    Test worker] c.e.mapper.UserCustomMapper.getUser  : ==>  Preparing: select * from user where user_id = ?
2021-04-29 23:39:04.705 DEBUG 4206 --- [    Test worker] c.e.mapper.UserCustomMapper.getUser  : ==> Parameters: 1(Long)
2021-04-29 23:39:04.725 DEBUG 4206 --- [    Test worker] c.e.mapper.UserCustomMapper.getUser  : <==      Total: 1
BUILD SUCCESSFUL in 3s

SQLのテストは大変

in-memoryデータベースを用意しましたが、事前準備からテスト実施まで大変ですよね。。。 Readのテストなら事前データの投入ですみますが、CUDだったらもっと大変になります。 それはまた別の機会に記載させていただけたらと思います。

MybatisTestについて、もっと知りたい方は以下を参考にしてください。

mybatis.org