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