概要
GenTestタスクは、テストクラスのコードを生成します。 現在のバージョンでは、SQLファイルに書かれたSQLを実行してSQLが正しいことを確認するテストコードを生成します。
GenTestタスクを利用するには、次のようにtaskdefタグとtypedefタグを使ってタスクとデータ型を定義する必要があります。
<taskdef name="gen" classname="org.seasar.doma.extension.gen.task.Gen" classpathref="classpath" loaderref="loader"/> <typedef name="sqlTestConfig" classname="org.seasar.doma.extension.gen.task.SqlTestConfig" loaderref="loader"/>
taskdefのclasspathref属性には、Doma-Gen、FreeMarkerのjarファイルが参照されるように設定してください(Doma本体のjarファイルは不要です)。
定義したタスクとデータ型は次のように使用します。
<target name="genTest">
<genTest
dialectName="${dialectName}"
driverClassName="${driverClassName}"
url="${url}"
user="${user}"
password="${password}">
<sqlTestConfig
destdir="${javaDestDir}"
testClassName="${sqlTestClassName}">
<fileset dir="${sqlDestDir}">
<include name="${sqlFilePattern}"/>
</fileset>
</sqlTestConfig>
</genTest>
</target>
生成されるJavaコードは次のようになります。
public class SqlTest extends TestCase {
...
public void test0() throws Exception {
SqlFile sqlFile = repository.getSqlFile("META-INF/example/dao/AddressDao/selectById.sql", dialect);
execute(sqlFile);
}
public void test1() throws Exception {
SqlFile sqlFile = repository.getSqlFile("META-INF/example/dao/AddressDao/selectByIdAndVersion.sql", dialect);
execute(sqlFile);
}
public void test2() throws Exception {
SqlFile sqlFile = repository.getSqlFile("META-INF/example/dao/CategoryDao/selectById.sql", dialect);
execute(sqlFile);
}
...
}
対象とするSQLファイルの数だけテストメソッドが生成されます。
パラメータ
トップレベルパラメータ
トップレベルパラメータの定義は次の通りです。
| 属性 | 説明 | デフォルト値 | 必須 |
|---|---|---|---|
| dialectName | 接続するRDBMSの方言名です。次のうちのどれかを指定できます。"h2"、"hsqldb"、"mysql"、"postgres"、"oracle"、"db2"、"mssql2008"、"mssql"。この名前に対応するクラスは、GenTestタスクを実行するクラスパスに通されている必要があります。 | - | dialectClassNameが指定されていない場合YES |
| dialectClassName | 接続するRDBMSの方言クラス名です。org.seasar.doma.jdbc.dialect.Dialectの実装クラスでなければいけません。dialectNameの指定により利用できる組み込みの方言クラス以外を利用する場合に指定します。指定するクラスは、GenTestタスクを実行するクラスパスに通されている必要があります。 |
- | dialectNameが指定されていない場合YES |
| driverClassName | JDBCドライバクラス名です。java.sql.Driverの実装クラスでなければいけません。 |
- | YES |
| url | JDBC接続URLです。 | - | YES |
| user | JDBC接続ユーザーです。 | - | YES |
| password | JDBC接続パスワードです。 | - | YES |
| templateEncoding | テンプレートファイルのエンコーディングです。 | "UTF-8" | NO |
| templatePrimaryDir | テンプレートファイルを検索する際の優先ディレクトリです。独自テンプレートファイルを使用する場合に指定します。 | - | NO |
| globalFactoryClassName | このタスクで使用されるインスタンスを生成するファクトリの完全修飾名です。org.seasar.doma.extension.gen.GlobalFactoryの実装クラスでなければいけません。このタスクの振る舞いをカスタマイズする場合に指定します。 |
"org.seasar.doma.extension.gen.GlobalFactory" | NO |
ネストした要素として指定されるパラメータ
SqlTestConfig
SQLのテストコードの生成に関する設定を表すデータ型です。
このデータ型を使用するとSQLのテストを行うJavaコードを生成できます。 生成されるテストコードは、JUnitとDomaに依存します。 このテストコードでは、SQLファイルに記述されたSQLをそのまま実行することでSQLが正しいことを確認します。 SQLの実行により変更されたデータはコミットせず、ロールバックします。
SqlTestConfigのパラメータ定義は次のとおりです。
| 属性 | 説明 | デフォルト値 | 必須 |
|---|---|---|---|
| generate | "true"の場合、Javaコードを生成します。 | "true" | NO |
| destDir | Javaコードの出力先ディレクトリです。 | "src" | NO |
| overwrite | "true"の場合、Javaコードを上書きします。 | "true" | NO |
| testClassName | 生成するテストクラスの名前です。 | "example.SqlTest" | NO |
| abstrct | "true"の場合、テストクラスを抽象クラスとして生成します。継承によってデータベースアクセス処理をカスタマイズしたい場合に"true"を指定してください。この名前は、「abstract」ではなく「abstrct」であることに注意してください。 | "false" | NO |
SqlTestConfigにネストした要素として指定されるパラメータ
FileSet
テスト対象のSQLファイルを指定するためにFileSetを使用します。 SQLファイルは次の条件を満たしていなければいけません。
- 拡張子がsqlである。
- META-INFディレクトリ以下に配置される。
使用例
独自のテンプレートファイルを使用する
Doma-Genのテンプレートは、配布ファイルのresources/templateディレクトリ以下にあります。 SQLをテストするクラスのテンプレートはsqlTest.ftlです。 これをコピーして、修正を加えるのが良いでしょう。 テンプレートの記述方法についてはFreeMarkerのドキュメントを参照してください。
修正したテンプレートファイルは、ファイル名を変更せずにtemplateFilePrimaryDir属性に指定するディレクトリに配置します。 mytemplateディレクトリに配置する場合、templatePrimaryDir属性にmytemplateを指定します。
<genTest
dialectName="${dialectName}"
driverClassName="${driverClassName}"
url="${url}"
user="${user}"
password="${password}"
templatePrimaryDir="mytemplate">
<sqlTestConfig
...
/>
<genTest/>
テンプレートは、特定のデータモデルを参照します。 テンプレートとデータモデルクラスの対応付けを以下に示します。
| テンプレート | データモデルクラス | 生成物 |
|---|---|---|
| sqlTest.ftl | org.seasar.doma.extension.gen.SqlTestDesc | SQLテストクラスのJavaファイル |
生成するJavaファイルに共通のヘッダーとしてコピーライトを含める
lib.ftlというファイルを作成し、これをtemplatePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにcopyrightの定義をします。
<#assign copyright> /* * Copyright 2008-2009 ... * All rights reserved. */ </#assign>
<genTest
dialectName="${dialectName}"
driverClassName="${driverClassName}"
url="${url}"
user="${user}"
password="${password}"
templatePrimaryDir="mytemplate">
<sqlTestConfig
...
/>
<genTest/>
生成するJavaファイルにauthorを指定する
lib.ftlというファイルを作成し、これをtemplatePrimaryDir属性に指定するディレクトリに配置します。 lib.ftlには次のようにauthorの定義をします。
<#assign author="Nakamura">
<genTest
dialectName="${dialectName}"
driverClassName="${driverClassName}"
url="${url}"
user="${user}"
password="${password}"
templatePrimaryDir="mytemplate">
<sqlTestConfig
...
/>
<genTest/>
