GUI 程式通過自動化測試套件,手工驗證卻發現本該被捕獲的錯誤行為。分散式/多執行緒系統中常見,但 GUI 領域另有專屬殺手:**Liar View(謊言視圖)** 錯誤模式。
MVC 架構下,模型狀態變更需觸發事件通知視圖更新。測試常僅檢查模型狀態,忽略視圖同步。若模型更新未觸發事件,測試通過但視圖顯示陳舊資料——視圖在「說謊」。
class Model extends AbstractListModel {
Vector elements = new Vector();
void remove(int index) {
elements.remove(index);
// 缺少 fireIntervalRemoved(this, index, index)!
}
}
測試斷言 model.getSize() 通過,但視圖項目未消失。將 PAUSE 設大以慢動作觀察即可重現。
view.getSelectedValue()、view.getModel().getSize() 等視圖 API,而非僅檢查模型。boolean 旗標,測試斷言旗標變化確保事件觸發。JTable 多方法直接委託模型,調用這些方法等同檢查模型,易陷入 Liar View 陷阱。
view.setSelectedIndex(0);
assert(view.getSelectedValue().equals("test0")); // 檢查視圖內容
controller.pause();
model.remove(0);
assert(model.getSize() == 1);
view.setSelectedIndex(0);
assert(view.getSelectedValue().equals("test1")); // 驗證視圖同步
自動化測試必須觸達視圖層。模型正確 ≠ 視圖正確。測試視圖顯式狀態,確保 MVC 同步鏈路完整。
下回將對付更具破壞性的錯誤:Corruptor Data(破壞者資料)。