我已經指出,我的測試集中于 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 展示了整個過程:
清單 6. 使用 GWT 輕松測試
public void testDefinitionValue() throws Exception {
WordModule module = new WordModule();
module.getDefinition("pugnacious");
Timer timer = new Timer() {
public void run() {
String value = module.getOutputLabel().getText();
String control = "inclined to quarrel or fight readily;...";
assertEquals("should be " + control, control, value);
finishTest();
}
};
timer.schedule(200);
delayTestFinish(500);
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/