我還可以通過獲得輸出 Label 實例的句柄,斷言其文本是否是給定單詞的定義,從而驗證應用程序的功能。在用 GWTTestCase 測試時,最好不要 嘗試手工強制改變組件狀態,而應該讓 GWT 完成這些工作。舉例而言,在清單 4 中,我想驗證對某個給定單詞返回了其正確定義并放入一個輸出 Label 中。無需操作 UI 組件來設置這個單詞;我只要直接調用 getDefinition 方法,然后斷言 Label 具有對應定義。
既然我已經編寫好了計劃進行測試的 GWT 應用程序,我需要實際編寫測試,這意味著設置 GWT 的 GWTTestCase。
設置 GWTTestCase
若想從 GWTTestCase 的測試魔力中獲益,需要遵守一些規則。幸運的是,規則很簡單:
所有用于實現測試的類和待測 GWT 模塊必須位于同一個包內。
運行測試時,您必須至少傳遞一個 VM 參數,指明在哪種 GWT 模式(托管或 Web)下運行測試。
您必須實現 getModuleName() 方法,它返回一個 String,表示您的 XML 模塊文件。
最后,因為與服務器端實體通信的 Ajax 應用程序在本質上是異步的,GWT 還提供了 Timer 類,以便延遲 JUnit,使異步行為在進行相關斷言之前全部完成。
實現 getModuleName 和 Timer 類
我已經指出,我的測試集中于 getDefinition() 方法(如 清單 4 所示)。您可以從代碼看到,測試邏輯非常簡單:傳入一個單詞(比如 pugnacious),然后驗證相應的 Label 文本是否得到正確定義。很簡單,對嗎?但是不要忘記,getDefinition() 方法在 AsyncCallback 對象中具有某種相關的異步性。
GWTTestCase 類是一個抽象 類,因為它的 getModuleName() 方法就是這么聲明的;因此,當您擴展該類時,您需要實現 getModuleName()(除非您是在為框架創建自己的基抽象類)。模塊名實際上就是您的 GWT XML 文件所在的包結構的名稱去掉文件擴展名。舉個例子,在本例中,我有一個名為 WordModule.gwt.xml 的 XML 文件,它位于一個目錄結構如:com/acme/gwt。相應的,模塊的邏輯名稱為 com.acme.gwt.WordModule,這會讓您想到 Java 平臺的普通包模式。
我已經得到一個模塊名,可以開始定義測試用例了,如清單 5 所示:
清單 5. 您必須實現 getModuleName 方法并提供一個有效的名字
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.Timer;
public class WordModuleTest extends GWTTestCase {
public String getModuleName() {
return "com.acme.gwt.WordModule";
}
}
到目前為止一切良好,但是我還沒有執行任何測試!由于我的 Ajax 應用程序使用 AsyncCallback 對象,在通過測試用例調用 getDefinition() 方法時, 我必須強迫 JUnit 延遲運行;否則測試將由于沒有任何響應而失敗。這就要用到 GWT 的 Timer 類。Timer 使我能夠重寫 getDefinition() 的 run 方法,在 Timer 內完成測試用例邏輯。(測試用例以獨立線程運行,有效地阻塞 JUnit 完成整個測試用例)。
以我的測試為例,我將首先調用 getDefinition() 方法,然后提供一個 Timer 的 run() 方法的實現。run() 方法得到輸出 Label 實例的文本并驗證是否是正確定義。定義了 Timer 實例后,我就需要確定其何時運行,同時強制 JUnit 掛起直至 Timer 實例完成。也許聽起來有點復雜,不必擔心,因為實踐起來非常簡易。實際上,清單 6 展示了整個過程:
文章來源于領測軟件測試網 http://www.kjueaiud.com/