2013/03/16

[java]Aptina Unitを使ってみたが、正しい使い方かわからん

JavaのAnnotation。
Pluggable Annotation Processing APIというらしいのだが、動いているかどうかがわからん。。。

見ていくと、Aptina Unitを使うのがよい、と書いているところが多かった。
よくわからないなりに、人々のサイトを参考にしながらやってみた。

こちらが、一番参考にさせていただいたサイト。
 Aptinaを利用するとAPTのテストが簡単に書けたよ - kurukuru-papaの日記

ここまで解説があってもわからないのが初心者の哀しいところよ。。。
使っているのは、ADT Build v21.1.0-569685。
JUNOベースらしい。

なお、動かしてみただけなので、やりかたが正しいかどうかはわからんです。


まず、Java Projectを作る。
ここでは「Java_Test6Unit」という名前で進める(なんて適当な名前なんだ・・・)。

srcフォルダの下に、自作Annotation一式のソースファイルを置く。
「下に」といっても、Javaファイルをそのまま置くのではなく、ちゃんとフォルダを掘るのだ。
私は「com.blogpost.hiro99ma.anno」というパッケージ名だったので、そう掘った。

image

 

名前はGetSetだが、中身はgetterとかsetterとは関係が無い。
あとでがんばろう。。

GetSet.java

package com.blogpost.hiro99ma.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface GetSet {
	boolean setter() default true;
	boolean getter() default true;
	String prop();
}

 

GetSetProcessor.java

package com.blogpost.hiro99ma.anno;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.Messager;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
import javax.tools.FileObject;
import javax.tools.StandardLocation;
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes("com.blogpost.hiro99ma.anno.GetSet")
public class GetSetProcessor extends AbstractProcessor {
	@Override
	public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
		if (annotations.size() == 0) {
			//annotation処理済み
			return true;
		}
		Messager messager = processingEnv.getMessager();
		Filer filer = processingEnv.getFiler();
		try {
			FileObject file = filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "hiro99ma.txt", (Element)null);
			PrintWriter writer = new PrintWriter(file.openWriter(), true);
			//annotationが使用されている要素
			for (TypeElement anno : annotations) {
				for (Element elem : roundEnv.getElementsAnnotatedWith(anno)) {
					GetSet getset = elem.getAnnotation(GetSet.class);
					//propに設定されている文字列が"hiro99ma"だったらメッセージを出す
					if (getset.prop().equals("hiro99ma")) {
						writer.println("おう : " + elem);
						messager.printMessage(Kind.NOTE, "You must be HIRO99MA.", elem);
					}
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}
}

 

自作Annotationを使うJavaファイルを作る。
場所はどこでもいいのだろうが、同じパッケージにした。
名前も何でもよさそうなので、「Foo」にした。

package com.blogpost.hiro99ma.anno;
@GetSet(prop = "hiro99ma")
public class Foo {}

 

AptinaTestCaseをextendsしたclassを作る。
これが、Foo.javaをコンパイルして、実行までやってくれるようだ。

package com.blogpost.hiro99ma.anno;
import java.nio.charset.Charset;
import java.util.Locale;
import org.seasar.aptina.unit.AptinaTestCase;
public class TestProcessorTest extends AptinaTestCase {
	public TestProcessorTest(String name) {
		super(name);
	}
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		setLocale(Locale.JAPANESE);
		setCharset(Charset.forName("UTF-8"));
		addSourcePath("src");
	}
	public void test() throws Exception {
		GetSetProcessor processor = new GetSetProcessor();
		addProcessor(processor);
		addCompilationUnit(Foo.class);
		compile();
		assertEqualsGeneratedSourceWithFile(
						"oops.txt",
						"com");
	}
}

サイトの方も書かれているが、setUp()でsetLocale()などをやらないと、addCompilationUnit()がエラーになってしまった。

あと、addSourcePath()で追加するのは、いわゆる「ソースフォルダ」の先頭みたいだ。
「src/com/・・・」と指定してたが、だめだったのだ。

 

ここまで追加すると、Eclipseがエラーをあれこれ出しているので、プロジェクトの設定をする。
もちろん、最初にやっててもよい。

まず、Aptina UnitのJARファイルを追加する。
ここからダウンロードし(今はAptina-1.0.0.zipだった)、解凍する。
中に「lib」フォルダがあり、その中に「aptina-unit-x.x.x.jarが入っている(私はaptina-unit-1.0.0.jar)。
これを適当にコピーして、プロジェクトの設定でLibrariesに追加。

image

これでよいかと思ったが「junit.frameworkがない」みたいなことを言われる。。。
よくわからんので、JUnit4をダウンロードして同じように追加した。
したのだが、もっと普通の方法があった。

上の画面で「Add Library ...」を押すと、JUnitが選択できる。
image

JUnit3かJUnit4かを迫られるので、新しい方がいいんじゃないの、と思ってJUnit4にした。

 

ここまでやると、Eclipseのエラーが出なくなった。
なお、プロジェクト設定でAnnotation Processingの設定は不要だ。


では、実際に動かしてみよう。

動いたかどうかがわからないというレベルなので、まずは自作のProcessorクラスのprocess()先頭にブレークポイントを設定。

そして、プロジェクト名で右クリックし、「Debug As > JUnit Test」を選択。
「Use configuration specific settings」にチェックし「Eclipse JUnit Launcher」を選択。
ここで「Java Application」を選択しても、ダメですぞ(それで悩んでた)。

 

そうすると、ブレークポイントのところで止まるんじゃないかね。
私のところは止まったよ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。