内部类的单元测试

在项目中需要处理一些多线程的东西,其中有写到一个内部类来处理一些逻辑。
准备对这个类进行单元测试时,发现无法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输出:

这是一个内部类

通过反射机制来完成我们的单元测试。

, ,

Leave a Reply