在项目中需要处理一些多线程的东西,其中有写到一个内部类来处理一些逻辑。
准备对这个类进行单元测试时,发现无法new这个类,如果把单元测试类也作为内部类的话,倒是可以解决这个问题,但是这样总觉得怪怪的。
当然还是有其他方法来完成内部类的单元测试的,比如我有这样的一个内部类:
/**
*
*/
package net.since1986;
/**
* @author lyoe
*
*/
public class Since1986 {
class InnerSince1986 {
public InnerSince1986() {
// Nothing
}
public void run() {
System.out.println("这是一个内部类");
}
}
}
单元测试类就这样写:
/**
*
*/
package net.since1986;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import junit.framework.TestCase;
/**
* @author lyoe
*
*/
public class Since1986Test extends TestCase {
private Since1986 since1986;
/*
* (non-Javadoc)
*
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
this.since1986 = new Since1986();
super.setUp();
}
/**
* 测试内部类的run()方法
*/
@SuppressWarnings("unchecked")
public void testInnerSince1986_run() {
Class[] cls = this.since1986.getClass().getDeclaredClasses();
Class innerSince1986Class = cls[0];
try {
Constructor[] cons = innerSince1986Class.getConstructors();
Constructor constructor = cons[0];
constructor.setAccessible(true);
Method runMethod = innerSince1986Class.getMethod("run",
new Class[] {});
runMethod.setAccessible(true);
runMethod.invoke(constructor
.newInstance(new Object[] { since1986 }), new Object[] {});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
console输出:
这是一个内部类
通过反射机制来完成我们的单元测试。