2013-03-24 146 views
1

我是新來的Java,我想寫一個JUnit測試的名稱校驗類模擬彈出對話框中的按鈕點擊的方法?

我想測試下面的代碼:

public boolean createNewUMLClassFromString(String className) { 
    if(validate(className)){ 
       .... 
    } 
    return false; 
} 

private boolean validate(String userInput){ 
    /* check if it's empty */ 
    if (userInput.equals("")){ 
        JOptionPane.showMessageDialog(null, "Class Name can't be empty"); 
     return false; 
    } 
      return true; 
} 

所以我寫了一個JUnit

public void emptyStringCheckerTest(){ 
    assertFalse("new class can not be empty", um.createNewUMLClassFromString("do")); 

} 

它的工作原理,但在測試運行過程中,我需要每次點擊彈出對話框。

所以有人可以告訴我如何在測試過程中模擬按鈕點擊,還是有更好的方法來編寫測試?謝謝?

回答

2

要執行編程按鈕點擊,只需調用doClick()方法即可。不過,我不知道如何將其插入到測試過程中。

0

重寫您的validate方法並將JOptionPane調用移動到您可以在單元測試中替換的單獨方法(例如包可見方法)。

private boolean validate(String userInput){ 
    /* check if it's empty */ 
    if (userInput.equals("")){ 
     showCannotBeEmptyDialog();    
     return false; 
    } 
      return true; 
} 

void showCannotBeEmptyDialog(){ 
    JOptionPane.showMessageDialog(null, "Class Name can't be empty"); 
} 

使其成爲包裝可見仍允許您覆蓋它在您的測試(如不顯示UI),你仍然能夠斷言方法是否真正叫的。

另一種選擇是將實例作爲構造參數傳遞給負責向用戶顯示消息。在您的產品代碼中,此實例將使用JOptionPane類,在您的測試中,您只需使用一個虛擬類。但是,如果僅僅是爲了顯示一個對話框,這可能是矯枉過正的。

+0

你的答案看起來很有希望,但是我仍然不知道如何在測試中覆蓋'showCannotBeEmptyDialog()'方法?這是用戶交互進行單元測試的最佳做法嗎? – mko 2013-03-24 19:00:45

+0

@yozloy不用測試該類的實例,而是使用該方法重寫測試擴展。不確定它是否是「最佳實踐」,但我已經多次使用它,並且更喜歡它在我看到的「Robot」和「doClick」解決方案中 – Robin 2013-03-24 19:45:11