public class DefaultModule implements EntryPoint {
public void onModuleLoad() {
Button button = new Button("Submit");
TextBox box = new TextBox();
Label output = new Label();
Label label = new Label("Word: ");
HorizontalPanel inputPanel = new HorizontalPanel();
inputPanel.setStyleName("input-panel");
inputPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
inputPanel.add(label);
inputPanel.add(box);
button.addClickListener(new ClickListener() {
public void onclick(Widget sender) {
String word = box.getText();
WordServiceAsync instance = WordService.Util.getInstance();
try {
instance.getDefinition(word, new AsyncCallback() {
public void onFailure(Throwable error) {
Window.alert("Error occurred:" + error.toString());
}
public void onSuccess(Object retValue) {
output.setText(retValue.toString());
}
});
}catch(Exception e) {
e.printStackTrace();
}
}
});
inputPanel.add(button);
inputPanel.setCellVerticalAlignment(button,
HasVerticalAlignment.ALIGN_BOTTOM);
RootPanel.get("slot1").add(inputPanel);
RootPanel.get("slot2").add(output);
}
}
清單 1 的代碼在運行時發生了嚴重的錯誤:它無法按照 JUnit 和 GWT 的 GWTTestCase 進行測試。事實上,如果我試著為這段代碼編寫測試,從技術方面來說它可以運行,但是無法按照邏輯工作?紤]一下:您如何對這段代碼進行驗證?惟一可用于測試的 public 方法返回的是 void, 那么,您怎么能夠驗證其功能的正確性呢?
如果我想以白盒方式驗證這段代碼,就必須分離業務邏輯和特定于用戶界面的代碼,這就需要進行重構。這本質上意味著把清單 1 中的代碼分離到一個便于測試的獨立方法中。但是這并非聽上去那么簡單。很明顯組件掛鉤是通過 onModuleLoad() 方法實現,但是如果我想強制其行為,可能 必須操縱某些用戶界面(UI)組件。
分解業務邏輯和 UI 代碼
第一步是為每個 UI 組件創建訪問器方法,如清單 2 所示。按照該方式,我可以在需要時獲取它們。
清單 2. 向 UI 組件添加訪問器方法使其可用
public class WordModule implements EntryPoint {
private Label label;
private Button button;
private TextBox textBox;
private Label outputLabel;
protected Button getButton() {
if (this.button == null) {
this.button = new Button("Submit");
}
return this.button;
}
protected Label getLabel() {
if (this.label == null) {
this.label = new Label("Word: ");
}
return this.label;
}
protected Label getOutputLabel() {
if (this.outputLabel == null) {
this.outputLabel = new Label();
}
return this.outputLabel;
}
protected TextBox getTextBox() {
if (this.textBox == null) {
this.textBox = new TextBox();
this.textBox.setVisibleLength(20);
}
return this.textBox;
}
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/