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(); }
属性 expected
は Class
型でデフォルト値として内部クラスを持つのですが,それがエラーになっちゃいます.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
の属性 timeout
は long
なのですが,上記のようにそのデフォルト値として 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]
と怒られてしまうので,どうしようもありません.
どうやら,float
や double
はサポートされていますが,long
は忘れれられているようで,JavaCC の文法定義すらありません.無念だ.
しょうがないのでデフォルト値は使わないで (expected
は null
で代用,timeout
はプリミティブ型だからどうせ 0 がデフォルト) その他の部分をちまちま移植.
どうにか JUnit4 が J2SE1.4 で動きました.\(^o^)/
といっても細かい検証はしていないのですが.心より恥じる.
そんなわけで (どんなわけで?),id:shot6 さん,デフォルト値に関しても報告して頂けると助かります.
今度は http://www.seasar.org/en/ の宣伝を忘れずに.(^^;