--
--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:

02
2009

JUnitでprivateのメソッドを楽に(?)テストするソース

CATEGORY自作ソフト
JUnit でどうにか private なんかのメソッドをテストできないもんかなぁ・・・と思って調べたら、リフレクションを駆使することで手間はかかるもののできることが判った。
こんな感じ。
try {
Method method = Foo.class.getDeclaredMethod("convert", String.class);
method.setAccessible(true);
assertEquals("output-string", method.invoke(new Foo(), "input-string"));
} catch (InvocationTargetException e) {
throw e.getCause();
} catch (Throwable e) {
fail(e.toString());
}

しかし、さすがに毎回これを書くのはちょっと冗長(特に例外周りが必要なとき)で、とはいえメソッド定義によってパラメータは変わるし、他にフィールドへのアクセスも書くと、もっとごちゃごちゃしてくるし・・・。
とか思ってたら、比較的きれい(に見える)共通のアクセスクラスが作れたので、公開してみる。

HiddenAccessor.javajavadocはこちら

詳細はjavadocを見てもらった方が早いと思うが、↑がこんな感じに書ける。
HiddenAccessor acc = new HiddenAccessor(Foo.class);
acc.setMethod("convert", String.class);
assertEquals("output-string", acc.invoke("input-string"));

Java 6, Eclipse 3.4 の JUnit 4.3 の環境で動作を確認。自分のプロジェクトに入れるときは、適当にパッケージ宣言を書き換えれば組み込めると思われる。
とりあえず、少し使ってみている限りでは、普通に使う範囲では問題なさそうに見える。

参考までに、それを使ってる自作ソース一式(Eclipseのプロジェクト形式)も晒してみる。
textconvert-0.2.zip
無駄に、Antのビルドファイルとかキャッシュとかに気合が入っているので、他にも何かの役に立つかも?
好きに使ってください・・・ということで一応いずれも修正BSDライセンスで、と書いときます。


とはいえ、いずれにしろメソッド名や定義変えたりしても追従できないから、リファクタリングが大変なんですがね(汗
しかし、何故俺は自宅でテストケースやら文字列変換処理やら作っているんだろう?
お勉強用に電卓を作ろうと思っていたはずなのだが・・・?


2009/6/3 追記。
JUnit-addonsPrivateAccessor というクラスで同じ事ができるということを知った(^^;

ITアーキテクト - JUnitスーパーTips 第2回 privateメソッドをテストする―クラスPrivateAccessorの活用―

クラス名もほぼ同じだが、Javadocを見たところ、メソッド名も同じだったw
あちらは全メソッドstaticのユーティリティクラスらしい。
ソースも、やってることは基本は大差無い模様。
例外処理の考え方は違うかな?
(向こうはinvoke失敗時に NoSuchMethodException やらを返すが、上の HiddenAccessor は呼び出し元で区別できないと嫌だったので Assert.fail()。名前とは裏腹にJUnitに依存しているのはこっちだけw)

ただ、ちょっと向こうの方が、作られた時期(Javaのバージョン)の関係上、引数がごちゃごちゃしていると思った。
でも、向こうの方が明らかにちゃんとテストされてるだろうな。。。

サンプルで上げた自作の文字列変換処理にも ICU4J とかのちゃんとしたのがあるようだし、やはり大概のことはOSSで何とかなるんだなぁ。
スポンサーサイト

Tag: Java JUnit

0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。