有如下类:
public class InnerClass {
    public void print() {
        System.out.println("Hello World");
    }    private class Inner {
        private Inner() {
        }        public void printe() {
            System.out.println("---------");
        }
    }
}
请问如何测试InnerClass$Inner?
我的初步想法如下,可是没有成功:
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;import junit.framework.TestCase;public class InnerClassTest extends TestCase {    public void testPrint() {
        new InnerClass().print();
    }
    public void testInnerClass() {
        InnerClass iner = new InnerClass();
        Class inerClass = iner.getClass();
        Class[] in = inerClass.getDeclaredClasses();
        for (Class c : in) {
            System.out.println(c.getName());
        }
        Class clIner = in[0];
        try {
            Constructor constructor = clIner.getDeclaredConstructor();//这里会出错的,
            constructor.setAccessible(true);
            Method method = clIner.getMethod("printe", new Class[] {});
            method.setAccessible(true);
            constructor.newInstance(new Object[] {});
            method.invoke(constructor.newInstance(new Object[] {}),
                    new Object[] {});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

解决方案 »

  1.   

    要测试内部类的话,单元测试类也要变成内部类。
    public class IncludeInnerClass {    private class Inner {
            public void sayHello() {
                System.out.println("Hello!");
            }
        }    public class InnerTester extends TestCase {        public void testSayHello() throws Exception {
                Inner i = new Inner();
                i.sayHello();
            }
        }
    }
      

  2.   

    YidingHe(机枪兵) 
    想问一下,是不是这种情况下的单元测试如果变成内部类了,就得修改原来的类,
    能不能不修原来的被测试单元而实现呢?
      

  3.   

    谢谢各位先,经过一定的努力,终于找到的方法:
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;import junit.framework.TestCase;public class InnerClassTest extends TestCase {
        public void testPrint() {
            new InnerClass().print();
        }    public void testInnerClass() {
            InnerClass iner = new InnerClass();
            Class inerClass = iner.getClass();
            Class[] in = inerClass.getDeclaredClasses();
            Class clIner = in[0];
            try {
                Constructor[] constructor = clIner.getDeclaredConstructors();
                Constructor cons = constructor[0];
                cons.setAccessible(true);
                Method method = clIner.getMethod("printe", new Class[] {});
                method.setAccessible(true);
                method.invoke(cons.newInstance(new Object[] { iner }),
                        new Object[] {});
            } catch (Exception e) {
                fail("test error!");
            }
        }}