daily affairs
クルマと、読んだ本のネタを中心に。
 



JUnitのClassLoaderにハマってしまいました

JUnitを使ってテストアプリケーションを作成していました。その中で諸事情により以下のようなコードがあります。
Class cls = hoge.Hoge.class;
Package pkg = cls.getPackage();
String name = pkg.getName();

ここで、pkgnullになってしまいます。

Class.getPackage()の説明には、「このクラスのクラスローダがパッケージオブジェクトを生成しなかった場合は、null が返されます。」と書かれていますが…、なんか素人にはよく分からない ただ、なんとなく、クラスローダが1つじゃなさそうだねってことは分かりました。

これを手がかりに見つけたのがここのFAQ。JUnitはTestCaseClassLoaderというクラスローダを使っているらしい。これはシステムデフォルトのクラスローダとは別物。。ということは、システムデフォルトのクラスローダがhogeというパッケージオブジェクトを生成して、TestCaseClassLoaderhoge.Hogeクラスをロードしたら、nullが返されるってことか~。やっと分かりました。

FAQに書いてあるようにexcluded.propertiesに追記したら、TestCaseClassLoaderhoge.Hogeクラスをロードしないようになるはず。

ということで以下の手順でやってみました。
(1) junit.jarを展開する(jar xf ....)
(2) junit/runner/excluded.propertiesをテキストエディタで開く
(3) excluded.propertiesの最後の行にexcluded.9=hoge.*を追加する
(4) junit.jarを作り直す(jar cmf ....)

これで、Class.getPackage()がちゃんとオブジェクトを返してくれるようになりました~
別に(4)の手順は不要なんですが、ただなんとなく(^^;


解決するまでに2時間くらいかかったのは内緒です

コメント ( 1 ) | Trackback ( 0 )