JUnitでprivateメソッドをテストする方法

JUnitでprivate/protectedメソッドをテストする方法

概要

Javaの単体テストではJUnitがよく使われる。publicメソッドについてはテストコードを書くが、privateprotectedメソッドのテストはおろそかになりがちである。

ホワイトボックステストはプログラマーの責務と考えられるため、すべてのコードをテストできるようにする必要がある。ここでは、すべてのメソッドをテストする方法を説明する。

テスト対象ソースコード

まず、テスト対象となる簡単なクラスを作成する。例ではpublicな加算メソッド、protectedな減算メソッド、privateな乗算メソッドを持つ。

publicメソッドのテスト

通常のテストケースでは、インスタンスを作成してpublicメソッドを直接呼び出せる。これは一般的なJUnitのテスト方法である。

protected、privateメソッドのテスト

protectedprivateメソッドは通常のインスタンス呼び出しでは直接呼べないため、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()で実行する。

結論

リフレクションを使うことで、直接呼び出せないメソッドもテストできる。バグはプログラマーにとって最大の敵なので、可能な限り取り除くように努めよう。