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