MyBatisのMapperをSpockで全自動テスト

MyBatisのSQLは2Way SQLではない上、動的SQLスニペットなどによって可読性が損なわれがちということもあり、構文エラーは早めに検知する仕組みを用意した方がよいという印象です。

そこで、Mapperを全スキャンして、SpockでData Driven Testingを行う方法がよいんじゃなかろうか?と考えました。
Spockを使うと、各SQLを一つのテストパターンとして実行できるので、SQLにバグがあった場合にそのMapper・メソッドが特定しやすくなるんじゃないかという狙いです。

というわけで、Springを使っていることを前提として、以下のような根拠の下で、実装してみました。

  • 通常Mapperインタフェースは特定のパッケージ以下にそろっているはずで、Springであれば ClassPathScanningCandidateComponentProvider を使うと、パッケージ配下のMapperインターフェース一覧を簡単に取得できる。
  • インタフェースが分かれば、対応するMapperの実体(コンポーネント)は ApplicationContext から getBean で取得できる。
  • 引数はとりあえずnullでない適当な値をセットしてしまえば、 NullPointerException にはならず、SQLクエリの実行自体は行えるはず。

で、作ってみたSpecificationは以下のような感じです。

MyBatis mappers automated test with Spock/Spring

ひとまず実行して例外が起きなければOK、という最低限のテストです。

手元のMapperで必要な最低限の型しか対応しておらず、また、デフォルトコンストラクタがない場合を考慮していなかったり、と不十分な点は多々ありますが、SQLを一通り実行してテストすることはできるようになりました。

(実行環境)

  • Spring Boot 1.4.2.RELEASE
  • mybatis-spring-boot-starter 1.2.0
  • spock-core 1.1-groovy-2.4-rc-3
  • spock-spring 1.1-groovy-2.4-rc-3