refrectの使用法

PrivateMethodをJUnitから呼び出す

あるクラスのPrivateMethodをテストするには、java.util.refrectを使用して呼び出します。
refrectの使用時、Classオブジェクトに呼び出したいPrivateMethodのクラスオブジェクトを代入し、そのMethodのパラメータタイプのオブジェクトをparameterType[]に設定します。
その後、呼び出したいPrivateMehodの関数名と先ほど設定したパラメータタイプをgetDecleardMedhodを使ってMehodオブジェクトに設定し、setAccessibleを使用し呼び出し可能にします。
あとは、そのPrivateMethodが取る引数をオブジェクトの配列に設定し、Methodオブジェクトのinvokeメソッドを用いて呼び出します。
結果は、invoke関数がオブジェクト型で返すので、それを適当な型にキャストを行い結果を検証します。

import junit.framework.*;

import java.util.*;


public class TestDriver extends TestCase {

    TestClass tragetClass = null;
    
    /** 試験対象オブジェクトのインスタンス化 */

    protected void setUp() {
        tragetClass = new TestClass();
    }

    public static Test suite(){
        TestSuite suite = new TestSuite();

        suite.addTest(new TestDriver("testPrivate"));

    }

    /** privateの呼び出し試験 */
    public void testPrivate() throws java.lang.NoSuchMethodException,
                                        java.lang.IllegalAccessException,
                                        java.lang.reflect.InvocationTargetException {

        Class cl = tragetClass.getClass();
        Class[] parameterTypes = new Class[1];
        parameterTypes[0] = Class.forName("java.util.Map");  // インタフェースの場合は Class.forNameで
        //parameterTypes[0] = (new String()).getClass();       // クラスの場合
        //parameterTypes[0] = Integer.TYPE;                    // プリミティブの場合
        Method md = cl.getDeclaredMethod("private_Method",parameterTypes);
        md.setAccessible(true);
        Object [] obj = {(Object)new HashMap()}; // パラメータを配列で指定する。
        // 呼び出します
        Object result = md.invoke(tragetClass,obj);
        // 戻り値を取得
        Map result_map = (Map)result;
        //判定
        //assertEquals(〜);
    }

}

戻る