超级访问另一个包中的默认类

时间:2013-02-11 09:03:09

标签: java unit-testing inheritance reflection

我正在尝试为单元测试用例创建可重用的模板类。假设类Sample和SampleTest属于同一个包,而Template属于不同的包。我得到实例化Sample类的错误。我希望该方法将被执行,就好像它是SampleTest类的一个方法,可以访问Sample。有没有办法使这项工作?

public SampleTest extends Template<Sample> {
     public void testMethod() {
          getTarget().method();
     }
}

public class Template<T> extends TestCase {

    /** Spied, object instance to test. */
    private transient T targetObject;

    /** Test class type to be derived as parameter type of test subclass. */
    private transient final Class<T> targetType;

    @Override
    public void setUp() throws Exception
    {
        super.setUp();
        setupTargetObject();
    }

    protected void setupTargetObject()
    {
        final T realObject =  targetType.newInstance(); //ERROR here if class under test is non-public
        targetObject = Mockito.spy(realObject);
    }

    protected Template() {
            final ParameterizedType paramedType = (ParameterizedType) getClass().getGenericSuperclass();
            targetType = (Class<T>) paramedType.getActualTypeArguments()[0];
    }

    protected T getTarget()
    {
        return targetObject;
    }

}

2 个答案:

答案 0 :(得分:0)

Java阻止在不同的包中调用类的任何非公共方法(以及构造函数)。编译器 JVM阻止了这种情况。 因此,您不能直接调用这些方法,并且,就像您的情况一样,您不能通过Java Reflection API调用这些方法。

如建议的那样,解决方案是在构造函数上使用setAccessible(true)。

答案 1 :(得分:0)

相反,我建议通过抽象方法负责创建实例到Sub-class。然后,您可以将其包装在该实例上进行间谍活动。