使用Java的反射机制在软件测试中调用私有类及方法
最近在做软件测试的题目,发现有的类的构造方法是私有的、有的类的某些方法是私有的,虽然可以通过巧妙的设计测试用例来覆盖到这些类和方法,但有没有更快的方法呢?哈哈,那就是利用Java的反射机制。
1、实例化 构造方法为私有类型 的 类
public class CSDN {
private int hahaha;
private String lalala;
//无参构造方法
private CSDN() {
System.out.println("调用了私有构造方法");
}
//有参构造方法
private CSDN(int hahaha, String lalala) {
this.hahaha = hahaha;
this.lalala = lalala;
System.out.println("调用了私有构造方法,参数为: " + hahaha + ", " + lalala);
}
}
测试类的写法:
import static org.junit.Assert.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class CSDNTest {
//无参构造方法的调用
@Test
public void test() {
try {
Class csdnClass = CSDN.class;
Constructor csdnConstructor;
csdnConstructor = csdnClass.getDeclaredConstructor();
csdnConstructor.setAccessible(true);
CSDN csdn = (CSDN)csdnConstructor.newInstance();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//有参构造方法的调用
@Test
public void test2() {
try {
Class csdnClass = CSDN.class;
Constructor csdnConstructor;
csdnConstructor = csdnClass.getDeclaredConstructor(int.class,String.class);
csdnConstructor.setAccessible(true);
CSDN csdn = (CSDN)csdnConstructor.newInstance(new Object[]{7, "String value"});
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、调用私有方法
public class CSDN {
private void printValue(int hahaha, String lalala) {
System.out.println(hahaha + ", " + lalala);
}
}
测试类的写法(若私有方法的类也是私有的,则应先按上述方法实例化私有类):
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
public class CSDNTest {
//无参构造方法的调用
@Test
public void test() {
CSDN csdn = new CSDN();
Method printValue;
try {
printValue = CSDN.class.getDeclaredMethod("printValue", int.class, String.class);
printValue.setAccessible(true);
printValue.invoke(csdn, 7, "调用私有方法");
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}