2017-09-13 35 views
2
訪問嵌套的私有靜態類

我有以下Java中的公共類,它看起來像:在Java中

public class MyClass 
{ 

    private static class MyNestedClass<T> extends SomeOtherClass 
    { 
    } 

} 

我寫一個測試,我需要創建使用PowerMockito爲MyNestedClass類模擬對象,但我不能夠訪問該類,因爲它是私人的。有沒有一種方法可以訪問MyNestedClass?

我試過如下:

MyClass.MyNestedClass myNestedClass = new MyClass.MyNestedClass() 

MyClass testNoteActivity = Mockito.spy(MyClass.class); 
testNoteActivity.MyNestedClass myNestedClass = new testNoteActivity.MyNestedClass() 

兩人都沒有爲我工作。

+0

沒有其他辦法嗎?根據定義,這個類是私有的,你將不得不將範圍改爲包來測試它。也許你可以窺探一個使用這個類實例的方法,如果你可以使用SomeOtherClass,它不是私有的。 – Beri

+1

如果測試代碼需要訪問該類,那麼它可能不應該是私有(靜態)類。 Powermock通常是最後的手段,如果您能夠控制代碼庫,我建議您考慮重構代碼或重新考慮您正在測試的內容。 –

回答

2

您可以通過反射訪問私有類:

final Class<?> nestedClass = Class.forName("MyClass$MyNestedClass"); 
final Constructor<?> ctor = nestedClass.getDeclaredConstructors()[0]; 
ctor.setAccessible(true); 
final Object instance = ctor.newInstance(); 
System.out.println(instance); 

,但它不是很好的做法。

要找到Class.forName的課程,您應該提供完整的課程名稱,包括包裝。例如。如果MyClass位於com.test包中,則該字符串應爲"com.test.MyClass$MyNestedClass"

+0

完美答案.. – ozgur