読者です 読者をやめる 読者になる 読者になる

kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

Aptinaを利用するとAPTのテストが簡単に書けたよ

Android Java

最近、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メソッドを使うと、事前に用意した期待結果のファイルと、実際の結果を比較出来ました。

動作確認環境