2013-08-27 58 views
1

如何驗證是否已調用私有嵌套類的非靜態方法? 這是我到目前爲止有:驗證靜態外部類的私有靜態嵌套類的非靜態方法的調用

new Verifications() { 
    { 
     Deencapsulation.invoke(MyClass.class.getDeclaredClasses()[0], "run"); 
     times = 4; 
    } 
}; 

我得到這個:

java.lang.IllegalArgumentException: Attempted to invoke non-static method without an instance to invoke it on... 


更新1:

@Dennis,我已經試過以下,雖然我'正在創建一個NPE。我想驗證run方法針對已存在於JVM中的單例的運行情況,而不是爲了調用方法m而創建它的新實例(如我在下面的代碼中所做的那樣)。我嘗試撥打m.invoke(null)沒有成功。有沒有辦法通過在外部類的運行實例上使用反射來驗證私有嵌套類中的非靜態方法的jmockit中的調用(通過它的調用)?

new Verifications() { 
     Class c = MyClass.class.getDeclaredClasses()[0]; 
     Method m = c.getDeclaredMethod("run"); 
     //Method m = MyClass.class.getDeclaredClasses()[0].getDeclaredMethod("run", Integer.class, CallableClient.class); 

     //Deencapsulation.invoke(MyClass.class.getDeclaredClasses()[0], "run"); 
     Class[] a = new Class[] { Integer.class, CallableClient.class}; 
     Object cc = Deencapsulation.newInstance(c, a); 
     //Object cc = Deencapsulation.newInstance(c, withInstanceOf(Integer.class), withInstanceOf(CallableClient.class)); 
     { 
      try { 
       System.out.println(MyClass.class.getDeclaredClasses()[0].getName()); 
       m.invoke(cc); 
       times = 3; 

更新2:

努力失敗,以獲得類似這樣的方法後:final Field runnable = MyClass.class.getDeclaredField("nestedClassInstance"); runnable.setAccessible(true);,然後使用getDeclaredMethods()以及getMethods(),我已經決定,但只是太多的錯誤使用這種方法繼續這個。我在測試中改變了我正在測試的內容。儘管我介紹了一個內部嵌套類的實例,但我假設我無法看到run方法的原因可能與以下一個或所有方面有關:包含它的類,構造函數和java的嵌套特性行爲/決定不顯示實例方法,直到它可以確保實例的成功構建。好奇地知道爲什麼我不能確定。

+0

您是否在尋找一種在運行時查找的方法?通過反思是可行的。 –

+0

是的,我是。這種方法會是什麼樣子? – Saad

+0

這需要一個外部類的實例,但我不得不創建它:http:// jmockit。googlecode.com/svn/trunk/www/tutorial/ReflectionUtilities.html。沒有公共構造函數,也沒有任何公共方法來獲取外部類的實例 – Saad

回答

2

既然你說過你想知道你是否試圖在運行時調用一個非靜態方法,那麼這一點反射應該會有所幫助。

假設m是對應於你的方法Method實例,然後Modifier.isStatic(m.getModifiers())將返回true當且僅當該方法是靜態的,所以你可以做這個檢查你居然叫invoke之前。 如果你還沒有Method對象,那麼類似ClassgetMethod將對你有用。

關於MethodModifierClass的文檔。


編輯:以上全部是檢查你通過invoke調用之前的方法是否是靜態的幫助。如果你想使用類似jmockit的東西來發現已經調用了這種方法,那麼我個人想知道這將如何幫助您獲得IllegalArgumentException,特別是如果它被拋出invoke因爲你正在嘗試做什麼異常消息說是不允許的。即使你可以嘲笑它,也可能涉及更深層次的問題。

+0

正確。所以,我創建了一個嵌套類的實例,我在外部類的一個方法中使用'new'。在我的測試中,我現在得到這樣的嵌套實例:'final Field runnable = MyClass.class.getDeclaredField(「nestedClassInstance」); runnable.setAccessible(true);'我無法從'runnable'獲得方法,但我不知道爲什麼。我使用'getDeclaredMethods()'和'getMethods()'打印了所有的方法。 – Saad

+1

因此,getDeclaredMethods()和getMethods()是不是回不了你想要的方法? (我假設你也嘗試過'getMethod()') –

+0

我沒有嘗試getMethod(),儘管我可能會花一些時間嘗試。謝謝你的幫助。 – Saad