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(〜);
}
}
|