2013-02-11 63 views
0

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

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; 
    } 

} 
+0

什么错误信息? – starblue 2013-02-11 09:08:53

+1

试试这个。 '构造函数 c = targetType.getConstructors()[0]; c.setAccessible(真);对象realObject = c.newInstance();' – sundar 2013-02-11 09:19:59

+0

谢谢你,工作。我有点困惑,因为我在发布之前尝试过,并得到安全异常。好吧。 – 2013-02-11 09:38:15

回答

0

Java可以防止调用不同包中类的非公共方法(以及构造函数)。这由编译器 JVM阻止。 因此,你不能直接调用这些方法,并且,就你而言,你不能通过Java Reflection API调用这些方法。

建议解决方案是在构造函数中使用setAccessible(true)。

0

相反,我会建议通过抽象方法将实例创建到子类的责任。然后,您可以将其包装起来以侦察该实例。