javaでのprivateメソッドのテスト

バッチ処理など、実行するとその中で順次処理を行って終わりのような作りになっていることが多い。
このようなプログラムの場合、単にデータを準備して実行する方法で、全てのパターンを網羅テストすることは難しい。
多くの場合、条件分岐がいくつも重なり、組合せ爆発が起こるからだ。
そして、orの場合どれか1つが満たすものだけにするだとかでパターンを間引いていく。

javaとかだと、処理をある単位でサブルーチン化し、サブルーチンごとにテストすれば、パターンの掛け算ではなく、パターンの足し算になるため、かなりの程度組み合わせ数が減る。
ただ、上記のように、単に実行するだけのプログラムの場合、mainメソッドだけpublicでサブルーチンは全部protectedprivateのような形にするのが普通だ。
これだと外側から呼べない。

こういう時にリフレクションが使える。
リフレクションは、宣言しているクラス構造を動的に変更する機能だ。
これにより、publicでないメソッドや変数をpublicに変更してから呼び出して、結果を見ることができる。

このような形で実装する。
コードの見通しは相当悪くなるが、テストコードの書き方を工夫することでなんとか出来るだろう。

Method method = 対象クラス.class.getDeclaredMethod("メソッド名", 第1パラメータのクラス名.class, 第2パラメータのクラス名..);
Field field = 対象クラス.class.getDeclaredField("変数名");
method.setAccesible(true);
field.setAccesible(true);
返り値型 ret = method.Invoke(オブジェクトのインスタンス, 第1パラメータ, 第2パラメータ);
変数型 val = field.get(オブジェクトのインスタンス);

staticのメソッドには、対象インスタンスをnullとして呼び出してやれば、実行できる。

Method method = 対象クラス.class.getDeclaredMethod("メソッド名", 第1パラメータのクラス名.class, 第2パラメータのクラス名..);
Field field = 対象クラス.class.getDeclaredField("変数名");
method.setAccesible(true);
field.setAccesible(true);
返り値型 ret = method.Invoke(null, 第1パラメータ, 第2パラメータ);
変数型 val = field.get(null);

あとは、大量のテストコードを書くのに心が折れないように、菩薩のような心を得るだけだ。

© 2009-2017 Osajiru All Rights Reserved.