天天看點

JUnit 3.8 通過反射測試私有方法

測試私有(private)的方法有兩種:

1)把目标類的私有方法(修飾符:private)修改為(public),不推薦,因為修改了源程式不佳

2)通過反射 (推薦)

代碼示範:

目标程式

PrivateMethod.java

package com.junit3_8;

public class PrivateMethod {

//私有方法

private int add(int a, int b)

{

return a +b ;

}

}

測試程式

PrivateMethodTest.java

package com.junit3_8;

import java.lang.reflect.Method;

import junit.framework.Assert;

import junit.framework.TestCase;

public class PrivateMethodTest extends TestCase {

public void testAdd() throws Exception

{

//PrivateMethod pm = new PrivateMethod();

//擷取目标類的class對象

Class<PrivateMethod> class1 = PrivateMethod.class;

//擷取目标類的執行個體

Object instance = class1.newInstance();

//getDeclaredMethod() 可擷取 公共、保護、預設(包)通路和私有方法,但不包括繼承的方法。

//getMethod() 隻可擷取公共的方法

Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class});

//值為true時 反射的對象在使用時 應讓一切已有的通路權限取消

method.setAccessible(true);

Object result = method.invoke(instance, new Object[]{1,2});

Assert.assertEquals(3, result);

}

}

小結:

getDeclaredMethod() 可擷取 公共、保護、預設(包)通路和私有方法,但不包括繼承的方法。

getMethod() 隻可擷取公共的方法

Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class});

等價于

Method method = class1.getDeclaredMethod("add", new Class[]{Integer.TYPE,int.Integer.TYPE});

因為 Integer.TYPE 表示基本類型 int 的 Class 執行個體

原文連接配接:http://blog.csdn.net/hzc543806053/article/details/7340546