Javaのprivateメソッドをjunitでテストする方法

java

タイトルの通り、JavaのprivateメソッドをJUnitでテストする方法です。

protectedメソッドも同様の方法でテストできます。

プラグインやライブラリは不要です。ただJavaがかける環境さえあれば、privateメソッドをJUnitでテストできます。

[スポンサーリンク]

この章でやること

リフレクションを使って、privateメソッドをjunitでテストします。

JUnitでテストする対象のクラス

こちらのクラスのprivateメソッドをテストしていきます。

public class Sample {

    public String get()
    {
        String result = getName(1);
        return result;
    }
  
    private String getName(Integer id) {
        String name = null;
        if (id == 1) {
            name = "test1";
        } else if (id == 2) {
            name = "test2";
        } else {
            name = "other";
        }
        return name;
    }
}

privateメソッドをテストするjunitクラス

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.lang.reflect.Method;
import org.junit.Test;

public class SampleTest {

    @Test
    public void test() throws Exception {
        Method method = 
                Sample.class.getDeclaredMethod("getName", Integer.class);
         
        // trueをセットすることで、privateメソッドへアクセス可能となります。
        method.setAccessible(true);

        // 第二引数以降が、メソッドの引数です。
        // 引数が複数ある場合は、複数指定できますし、引数が無い場合は何も指定しなくてOKです。
        String resutl = (String)method.invoke(new Sample(), new Integer(1));
         
        assertThat(resutl, is("test1"));
    }

解説

10~11行目でprivateメソッドのMethodオブジェクトを作成しています。
privateメソッドを実行するには、このMethodオブジェクトを使っていきます。

18行目で、privateメソッドを実行しています。
invokeメソッドの第二引数以降は、privateメソッドに渡す値です。ソース中にも書いている通り、引数が複数ならここに複数引数を指定します。

逆に引数が存在しない場合は、なにも指定しません。nullすらも指定しません。

18行目ですが、テスト対象のメソッドの戻り値がString値なので、String値にキャストして下さい。

最後に

今回は通常のprivateメソッドのテスト方法を紹介しました。

もちろんstatic privateメソッドもこちらと同じ方法(少しだけ違います)でテストすることが可能です。

staticなprivateメソッドのテスト方法については、コチラで紹介していますので併せて読んでみて下さい。

それでは!