测试private methods
Junit FAQ
How do I test private methods?

Testing private methods may be an indication that those methods should be moved into another class to promote reusability.

But if you must...

If you are using JDK 1.3 or higher, you can use reflection to subvert the access control mechanism with the aid of the PrivilegedAccessor. For details on how to use it, read this article.
以下给出一个例子:
package
junit;

import
java.lang.reflect.
*
;

class
Sup
{
public int data;
}

public
class
Unit3
extends
Sup
{
private int data;

public Unit3() {
this(0);
}

public Unit3(int data) {
this.data = data;
}

private int getData() {
return this.data;
}
private int getData2(int i){ //with paramater
return this.data + i;
}
}
测试类
package
junit;

import
org.junit.
*
;
import
java.lang.reflect.
*
;

public
class
Unit3Test
{
private Unit3 c = new Unit3(10);
private final Method methods[] = Unit3.class.getDeclaredMethods();
@Test
public void testGetData() throws Exception{
for(int i = 0 ; i<methods.length; ++i){
if(methods[i].getName().equals("getData")){
methods[i].setAccessible(true);
Object o = methods[i].invoke(c);
Assert.assertEquals(new Integer(10), o);
}
}
}
@Test
public void testGetData2() throws Exception{
for(int i = 0 ; i<methods.length; ++i){
if(methods[i].getName().equals("getData2")){//找到要测试的private method
methods[i].setAccessible(true); //设置可以访问
Object para[] = {123}; //参数列表
Object o = methods[i].invoke(c,para); //相当于c.privateMethod(para)
Assert.assertEquals(new Integer(10+123), o);//测试
}
}
}
}
测试结果
Junit FAQ
How do I test private methods?
Testing private methods may be an indication that those methods should be moved into another class to promote reusability.
But if you must...
If you are using JDK 1.3 or higher, you can use reflection to subvert the access control mechanism with the aid of the PrivilegedAccessor. For details on how to use it, read this article.
以下给出一个例子:
package
junit;
import
java.lang.reflect.
*
;
class
Sup
{
public int data;
}

public
class
Unit3
extends
Sup
{
private int data;
public Unit3() {
this(0);
}
public Unit3(int data) {
this.data = data;
}
private int getData() {
return this.data;
}
private int getData2(int i){ //with paramater
return this.data + i;
}
}
测试类
package
junit;
import
org.junit.
*
;
import
java.lang.reflect.
*
;
public
class
Unit3Test
{
private Unit3 c = new Unit3(10);
private final Method methods[] = Unit3.class.getDeclaredMethods();
@Test
public void testGetData() throws Exception{
for(int i = 0 ; i<methods.length; ++i){
if(methods[i].getName().equals("getData")){
methods[i].setAccessible(true);
Object o = methods[i].invoke(c);
Assert.assertEquals(new Integer(10), o);
}
}
}
@Test
public void testGetData2() throws Exception{
for(int i = 0 ; i<methods.length; ++i){
if(methods[i].getName().equals("getData2")){//找到要测试的private method
methods[i].setAccessible(true); //设置可以访问
Object para[] = {123}; //参数列表
Object o = methods[i].invoke(c,para); //相当于c.privateMethod(para)
Assert.assertEquals(new Integer(10+123), o);//测试
}
}
}
}
测试结果
本文介绍了如何在JUnit中通过反射来测试private方法。尽管通常不建议直接测试私有方法,但当确实需要时,可以利用Java 1.3及以上版本的反射API和 PrivilegedAccessor。提供了一个例子,展示如何为一个名为Unit3的类的两个私有方法getData()和getData2(int i)编写测试用例。


1万+

被折叠的 条评论
为什么被折叠?



