2010-03-21 28 views
1

我有一個JUnit測試類,其中有幾個static final int s,可以在測試器代碼的頂部重新定義,以允許測試值發生一些變化。我在@BeforeClass方法中有邏輯來確保開發人員輸入的值不會破壞我的測試。在JUnit(4.8.1)測試套件中分配靜態final int

如果開發人員設置boolean useRandomValues = true;,我希望通過允許在@BeforeClass方法中將這些整數設置爲(明智的)隨機值來進一步改進變體。我可以簡單地刪除final關鍵字,以允許隨機值覆蓋初始化值,但是我有final以確保這些值不會無意中更改,因爲某些測試依賴於這些值的一致性。

  1. 我可以在JUnit測試類中使用構造函數嗎?如果我試圖使我的@BeforeClass成爲測試類的構造函數,並且使得單獨的構造函數似乎不允許賦值給這些變量(即使我將它們留在未聲明的聲明處),那麼Eclipse開始在任何地方放置紅色下劃線。

  2. 是否有另一種方法來確保在@BeforeClass方法之後嘗試更改這些變量會導致編譯時錯誤?

  3. 是否已經初始化?

+1

你爲什麼要使用靜態的呢?正常的字段會比較容易。 – skaffman 2010-03-21 22:53:05

+0

在測試中使用隨機值通常不是一個好主意,因爲隨機測試輸出可能很糟糕。當您運行一次測試並通過測試,然後再次運行它們並失敗時,可能很難找出失敗的原因。如果我是你,我會確保在隨機值啓用時輸出足夠多的紅旗,並確保記錄這些隨機值,以便如果一組值的測試失敗,則可以返回並重新測試這些值隔離潛在的問題。 – Ricket 2010-03-31 20:48:33

+0

這是一個很好的觀點,我從這個角度沒有想過。在這種情況下,我可以在測試套件運行時將值輸出到控制檯,或者我可以在每個斷言的失敗消息中包含相關值,或者將所有值以某種方式記錄到文件中。 在這種情況下,我不認爲我從隨機數中獲得了足夠的價值,因爲它值得讓它們留在其中,所以我會把它們拿出來(我已經將這個功能默認爲禁用,所以它應該不會反正正常使用的差異)。 – 2010-03-31 23:25:40

回答

2

您可以用靜態構造函數做到這一點:

import java.util.Random; 
public class StaticRandom 
{ 
    private static final boolean useRandomValues = true; 
    private static final Random r = new Random(); 
    private static final int value1; 
    private static final int value2; 
    private static final int value3; 
    static 
    { 
    if(useRandomValues) 
    { 
     value1 = r.nextInt(); 
     value2 = r.nextInt(); 
     value3 = r.nextInt(); 
    } 
    else 
    { 
     value1 = 0; 
     value2 = 0; 
     value3 = 0; 
    } 
    } 
} 
+0

完美,那正是我以後的樣子。靜態構造函數就像它們出現的簡單概念一樣嗎?何時會處理靜態構造函數?我的假設是它會在編譯時被處理,並且上面的代碼最終會像 value1 = 23140542; //注意:我剛剛在這裏搗毀了數字鍵盤 value2 = 20424040; value3 = 87618735; 然後,編譯器可能會用代碼中顯示的int文字替換那些變量。 – 2010-03-22 00:28:12

+0

Monkey博士,靜態塊包含普通代碼,該類在初始化類時(即,在運行時首先加載到JVM中)而不是在編譯時處理。規則並不那麼複雜。有幾點需要注意的是,代碼是按照文本順序運行的(這意味着您可能無法在稍後聲明的同一範圍內引用變量),並且靜態塊不能引發已檢查的附加內容。有關信息,您可以從http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#39245和http://java.sun.com/docs/books/tutorial /java/javaOO/initial.html。 – 2010-03-22 22:55:05

2

您可以使用一個靜態初始化:

final static boolean useRandomValues = true; 

final static int valueA; 
final static int valueB; 
static { 
    if(!useRandomValues) { 
     valueA = 42; 
     valueB = 1337; 
    } 
    else { 
     Random rnd = new Random(); 
     valueA = rnd.nextInt(100); 
     valueB = rnd.nextInt(100); 
    } 
}