JUnitでprivateメソッドをテストする方法
JUnitでprivate/protectedメソッドをテストする方法
概要
Javaの単体テストではJUnitがよく使われる。publicメソッドについてはテストコードを書くが、privateやprotectedメソッドのテストはおろそかになりがちである。
ホワイトボックステストはプログラマーの責務と考えられるため、すべてのコードをテストできるようにする必要がある。ここでは、すべてのメソッドをテストする方法を説明する。
テスト対象ソースコード
まず、テスト対象となる簡単なクラスを作成する。例ではpublicな加算メソッド、protectedな減算メソッド、privateな乗算メソッドを持つ。
publicメソッドのテスト
通常のテストケースでは、インスタンスを作成してpublicメソッドを直接呼び出せる。これは一般的なJUnitのテスト方法である。
protected、privateメソッドのテスト
protectedやprivateメソッドは通常のインスタンス呼び出しでは直接呼べないため、Javaのリフレクションを使用する。
Sample sample = new Sample();
Method method = Sample.class.getDeclaredMethod("{メソッド名}", {引数1}, {引数2}...);
method.setAccessible(true);
int actual = ({戻り型}) method.invoke(<インスタンス>, {引数1}, {引数2}...);
どのクラスにも存在するclass変数を使い、getDeclaredMethod()でテスト対象メソッドを取得する。返されたメソッドにsetAccessible(true)を設定して外部からアクセスできるようにし、method.invoke()で実行する。
結論
リフレクションを使うことで、直接呼び出せないメソッドもテストできる。バグはプログラマーにとって最大の敵なので、可能な限り取り除くように努めよう。