2013-02-11 43 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

相反,我會建議通過抽象方法將實例創建到子類的責任。然後,您可以將其包裝起來以偵察該實例。