エキサイト株式会社 メディア事業部エンジニアの中です。
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に設定します。
- 細かい設定は公式サイトから参照してください。
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
@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について、もっと知りたい方は以下を参考にしてください。