如何驗證是否已調用私有嵌套類的非靜態方法? 這是我到目前爲止有:驗證靜態外部類的私有靜態嵌套類的非靜態方法的調用
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的嵌套特性行爲/決定不顯示實例方法,直到它可以確保實例的成功構建。好奇地知道爲什麼我不能確定。
您是否在尋找一種在運行時查找的方法?通過反思是可行的。 –
是的,我是。這種方法會是什麼樣子? – Saad
這需要一個外部類的實例,但我不得不創建它:http:// jmockit。googlecode.com/svn/trunk/www/tutorial/ReflectionUtilities.html。沒有公共構造函數,也沒有任何公共方法來獲取外部類的實例 – Saad