Aptinaを利用するとAPTのテストが簡単に書けたよ
最近、APT(Annotation Processing Tool)を勉強しています。そのなかで、テストケースはどう書けば良いのか考えていました。特に、Annotation Processorのprocessメソッドの引数として必要な、Set型のオブジェクトと、RoundEnvironment型のオブジェクトの2つをどう作成すればいいのか分かりませんでした。調べてみたところ、SeasarプロジェクトのAptina Unitを使うと、上述の2つの引数を意識しなくてもテストケースが書けそうです。早速、簡単なテストケースを作成してみたので、メモしておきます。
概要
前回の日記で紹介した、APTによるAndroid向け簡易O/Rマッパーに対して、Aptina Unitを利用したテストケースを作成してみました。
特に難しいことはありませんでした。Aptina UnitのJarファイルにビルドパスを通し、AptinaTestCaseクラスを継承して、テストクラスを書けば良いだけですね。
ただし、1点だけ手間取った箇所がありました。Aptina Unitによるテストケースの書き方を説明したページを参考にテストケースを書いていたのですが、少々情報が古い(?)ようで、テスト実施時に必要な以下の言語設定が足りませんでした。この設定が足りないとNullPointerExceptionが発生してしまいました。
setLocale(Locale.JAPANESE);
setCharset(Charset.forName("UTF-8"));
テストケース作成
Eclipseのパッケージエクスプローラは次のように作成しました。赤枠で括った部分が、テスト用に作成したファイルと、AptinaのJarファイルです。
テスト対象としたAPTを動作させるため、簡単なクラスを定義しアノテーションを付けます。ここでは、SimpleEntityクラスという名前で、Entityアノテーションを付けておきました。
@Entity public class SimpleEntity { 省略
テストクラスです。Aptina Unitで用意されているAptinaTestCaseクラスを継承して作成します。setUpメソッドでは、言語設定とソースパスを設定しておきます。上述しましたが言語設定を忘れるとNullPointerExceptionが発生しました。
public class DaoGeneraterTest extends AptinaTestCase { @Override protected void setUp() throws Exception { super.setUp(); // 言語設定 setLocale(Locale.JAPANESE); setCharset(Charset.forName("UTF-8")); // ソースパスを追加 addSourcePath("test"); } public void testSimple() throws Exception { // テスト対象の Annotation Processor を生成して追加 TryAndroidProcesser processor = new TryAndroidProcesser(); addProcessor(processor); // コンパイル対象を追加 addCompilationUnit(SimpleEntity.class); // コンパイル実行 compile(); // 結果確認 assertEqualsGeneratedSourceWithFile( getExpectedFilePath("DaoGeneraterTest_Simple.txt"), "com.kurukurupapa.tryandroid.apt001.SimpleEntityDao"); } private String getExpectedFilePath(String name) { String subPath = "/" + getClass().getPackage().getName().replace('.', '/') + "/" + name; return getClass().getResource(subPath).getPath(); } }
Annotation Processorのオブジェクトを作って、アノテーションを付加したクラスを登録し、compileメソッドを呼ぶだけで、APTが動作しました。簡単ですね。APTの結果を簡単に確認するassertメソッドもいくつか用意されていました。assertEqualsGeneratedSourceWithFileメソッドを使うと、事前に用意した期待結果のファイルと、実際の結果を比較出来ました。