2012-08-06 38 views
2

這是我第一次嘗試使用反射進行單元測試,並且我有這個疑問。通過反射檢查局部變量值的變化

Class Example { 
    public static Map<Something, Something> someMethod() 
    { 
    int temp = -1; 
    //Some implementation which might change the value of temp 
    //depending on other cases 
    if(temp == -1) 
     //Do something and return something 
    else 
     //return null 
    } 
} 

現在,在上面的片段,我可以使用反射獲取變量temp的初始值。我想知道,如果變量的值在執行代碼時發生變化,我怎麼才能得到temp的新值?是一個全新的反思,所以如果這聽起來很愚蠢,請耐心等待。

P.S實際的測試代碼並不是那麼簡單。我有一種感覺,我不能使用反射或powermock單元測試最後的if條件。

回答

3

您不能使用反射來訪問局部變量的狀態。實例變量是,靜態變量是,局部變量號。

此外,作爲@platzhirsch筆記,反射不允許您將觸發器附加到任何類型的變量。這種事情需要某種字節碼的修改。但是,單元測試不需要觸發器。檢查前後值應該足夠。

我認爲你真正的問題在於你的課程沒有被設計成使單元測試變得簡單。首先你有一個靜態方法,他們很難「模擬」。其次,看起來你試圖測試的邏輯是嵌入裏面的的一種方法。如果(例如)temp是一個實例變量,或者// Some implementation ...中的代碼是一種可以模擬的方法,則會更容易。


順便說一下,在這種情況下,您使用術語「私人」是誤導。大多數Java程序員會用「private」修飾符將「private」解釋爲靜態或實例變量。但是您的示例將temp聲明爲局部變量,因爲private修飾符不允許用於局部變量。

4

您不能在某個事件發生後通過反射來觸發某個變量上的方法。你平常做單元測試如下:

  1. 檢查的初始狀態的變量
  2. 做一些動作
  3. 檢查您的變量的狀態是否仍然是合法的

如果2.中的行爲太多了(在這種情況下,我會理解你的問題),那麼你必須編寫更細的單元測試。

此外,如果你想用JUnit檢查局部變量,它表明,你的方法實現可能太複雜,應該分離,在這種情況下你可以改進測試,分別使其可測試。

而且看一看的問題的答案:Is it bad practice to use Reflection in Unit testing?

+0

感謝我用詹金斯建立鏈接^^ – noMAD 2012-08-06 15:26:04

2

正如其他人所指出的那樣,你不能使用反射來訪問一個局部變量的狀態,也不能使用反射,如果通知你「任何改變」。

可以,然而,在一個調試器中運行的代碼(例如,在Eclipse調試器),以及任何變量設置一個「觀察點」,你想監控:

+0

和c愛人檢查代碼覆蓋率,因此我認爲我不能做你所說的話。 :) – noMAD 2012-08-06 15:23:58