backport175 体験記 − Backport JUnit4

backport175 で日本語 (というか非 ASCII) がうまく扱えない件について,id:shot6 さんが ML に報告をしてくれました.さっそく CVS にその修正がコミットされてます.ありがたや〜.
そんなわけで (どんなわけで?),もうちょっと backport175 で遊んでみることにしました.
んで,それならアノテーションを活用した話題の JUnit4 を backport したらおもしろいかなぁ,なんて思ってやってみました.まぁ,F1 がつまらなかったからね.


そんなわけで (どんなわけで?),

  • Java5 のアノテーションを backport175 のアノテーションに変更.
  • Java5 のリフレクションでアノテーションを操作しているところを backport175 に変更.
  • Java5 の Concurrent を使っているところは backport-util-concurrent に変更.
  • generics 等 Java5 の新機能を使っているところを変更.

って感じでやってみました.


んで,backport175 でデフォルト値の扱いで少々問題が.
JUnit4 の @Test アノテーションの backport175 版は次のようになるのですが...

package org.junit;

//import java.lang.annotation.ElementType;
//import java.lang.annotation.Retention;
//import java.lang.annotation.RetentionPolicy;
//import java.lang.annotation.Target;

/**
 * @Retention(RetentionPolicy.RUNTIME)
 * @Target(ElementType.METHOD)
*/
public interface Test {
	static class None extends Throwable {
		private static final long serialVersionUID= 1L;		
		private None() {
		}
	}
	
	/**
	 * @org.codehaus.backport175.DefaultValue(org.junit.Test.None.class)
	 */
	Class expected();

	/**
	 * @org.codehaus.backport175.DefaultValue(0L)
	 */
	long timeout(); 
}

属性 expectedClass 型でデフォルト値として内部クラスを持つのですが,それがエラーになっちゃいます.java.lang.Object.class とか書くと大丈夫なのですが,この例のようにソースファイルからコンパイルされるようなクラスを指定すると

org.codehaus.backport175.DefaultValue : cannot parse annotation [@org.codehaus.backport175.DefaultValue(org.junit.Test.None.class)] due to: could not load class [org.junit.Test.None] due to: java.lang.ClassNotFoundException: org.junit.Test.None

って怒られてしまいます.Eclipse plugin 固有の問題で Ant タスクなら大丈夫なのかとかは未確認.


それから,long がサポートされていません.@Test の属性 timeoutlong なのですが,上記のようにそのデフォルト値として 0L と書くと

org.codehaus.backport175.DefaultValue : cannot parse annotation [@org.codehaus.backport175.DefaultValue(0L)] due to: octal numbers not yet supported

デフォルト値を 0 にすると

org.codehaus.backport175.DefaultValue : value [value] in annotation [org.codehaus.backport175.DefaultValue] does not have correct type: expected [long] was [int]

と怒られてしまうので,どうしようもありません.
どうやら,floatdouble はサポートされていますが,long は忘れれられているようで,JavaCC の文法定義すらありません.無念だ.


しょうがないのでデフォルト値は使わないで (expectednull で代用,timeout はプリミティブ型だからどうせ 0 がデフォルト) その他の部分をちまちま移植.
どうにか JUnit4 が J2SE1.4 で動きました.\(^o^)/
といっても細かい検証はしていないのですが.心より恥じる.


そんなわけで (どんなわけで?),id:shot6 さん,デフォルト値に関しても報告して頂けると助かります.
今度は http://www.seasar.org/en/ の宣伝を忘れずに.(^^;