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

java

javaのprivate・protectedメソッドをjunitでテストする方法を紹介します。

[スポンサーリンク]

junitでテストしようとして、privateメソッド内の処理が複雑であるがゆえに、テストを諦めた経験はありませんか??
ついつい納期に追われてたりすると、junitのテストケースが犠牲になりがちです。。
わたしも経験があります。

今回紹介する方法であれば、privateメソッドのテストも網羅的にケースを書くことが出来ます。
今回紹介する方法は、特別なプラグインやライブラリは不要です。

この章でやること

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

今回テストしたいのは、このクラスのprivateメソッドです。

public class Sample {

    public static void main( String[] args )
    {
    	String ret = getName(1);
        System.out.println( ret );
    }
    
    /**
     * このprivateメソッドをjunitでテストします。
     * @param id
     * @return
     */
    private static 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クラス

public class SampleTest extends TestCase {

    public void test_getName_test_001() 
    		throws NoSuchMethodException,
    				SecurityException,
    				IllegalAccessException,
    				IllegalArgumentException,
    				InvocationTargetException
    {
    	Method method = 
    			Sample.class.getDeclaredMethod("getName", Integer.class);
    	
    	// trueをセットすることで、privateメソッドへアクセス可能となります。
    	method.setAccessible(true);
    	
    	// privateメソッドを実行します。
    	Sample sample = new Sample();
    	// 第二引数以降が、メソッドの引数です。
    	String name = (String)method.invoke(sample, new Integer(1));
    	
    	assertEquals("test1", name);
    }
}

解説

10~11行目でprivateメソッドのMethodオブジェクトを作成しています。
getDeclaredMethodメソッドの第二引数以降は、privateメソッドの引数型です。

19行目で、privateメソッドを実行しています。
invokeメソッドの第二引数以降は、privateメソッドに渡す値です。

19行目では、privateメソッドを戻り値を取得しています。
今回のprivateメソッドは、戻り値がString値なので、String値にキャストしています。

最後に

privateメソッドのテストが、プラグイン・ライブラリ不要でテスト出来る点は嬉しい限りです。
privateメソッドがjunitテストの犠牲にならぬことを祈っています!
それでは!