先日紹介したMockRunnerのJDBC Mockですが、実戦投入を前提にチームのメンバーに見てもらっているのですが、いろいろと機能があるようです。たとえば以下のような感じでSQLの期待値の比較方法を制御することができます。
// 大文字・小文字を無視 jdbcTestModule.setCaseSensitive(false); // 期待値のSQLに正規表現を利用可能にする jdbcTestModule.setUseRegularExpressions(true);
正規表現を使えるので、
jdbcTestModule.verifySQLStatementExecuted( "SELECT .* FROM TABLE WHERE ID=\\?");
なんて書いておくとテーブルのカラム追加・削除くらいではテストケースを直す必要がなくなります。便利ですね。欲を言えばSQLの改行や空白の差異もいい感じに吸収してくれる機能があるとよいのですが…。
あと、ResultSetのモックをテキストファイルやXMLから生成する機能もあるみたいです(もちろんJavaコードだけで生成することもできます)。CSVから読み込む場合はこんな感じ。
FileResultSetFactory factory = new FileResultSetFactory(new File("test.csv")); // 1行目はカラム名 factory.setFirstLineContainsColumnNames(true); // デリミタを指定 factory.setDelimiter(","); // CSVからResultSetのモックを作成 MockResultSet rs = factory.create("一意なID"); // モックをハンドラにセット PreparedStatementResultSetHandler handler = connection.getPreparedStatementResultSetHandler(); handler.prepareGlobalResultSet(rs);
上記のコード例の場合、用意しておくCSVファイルはこんな感じです。
USER_ID,PASSWORD takezoe,password
XMLファイルから作成する場合はXMLResultSetFactoryを使います。
XMLResultSetFactory factory = new XMLResultSetFactory(new File("test.xml")); MockResultSet rs = factory.create("一意なID");
用意しておくXMLファイルはこんな感じ。
<rows> <row> <USER_ID>takezoe</USER_ID> <PASSWORD>password</PASSWORD> </row> </rows>
CSVやXMLを作るならExcelファイルを作るのと変わらないじゃん…という気もしますが、データベースのデータの場合は関連するテーブルのデータを作成する必要がありますが、JDBC Mockの場合はResultSetのデータだけで済むので作成するデータはかなり少なくなるはずです。
でもJavaコード中に書くほうがいいのか、外部化するのがいいのかはちょっと微妙かも…。