l

2014年9月30日 星期二

Test Double(3):Dummy Object

Sep. 22 18:02~18:47, 20:38~21:05

螢幕截圖 2014-09-22 22.08.45

 

待測系統

從這一集開始要分別用五種不同的Test Double來實作測試案例。首先先介紹待測系統,上圖是一個套用Command設計模式的監控系統,Server物件有四個函數:

  • addCommand:傳入一個ICommand物件(實作ICommand介面的物件),Server會利用向它註冊的ICommand物件來執行監控工作。
  • removeCommand:移除一個ICommand物件。
  • getCommandSize:傳回註冊的ICommand物件個數。
  • monitor:逐一呼叫每一個向它註冊的ICommand物件的execute函數以執行監控工作。

 

ICommand是一個介面(interface),只有一個函數:

  • execute:監控某個特定的設備,監控結果以Result物件表示。

 

Result物件有兩個函數:

  • getStatus:傳回整數代表監控結果,1表示OK,2表示CRITICAL。
  • getMessage:傳回字串代表監控結果的敘述。

 

目前這個監控系統有一個DoorCommand,可以用來監控門是否被打開或關閉。DoorCommand透過IDoor介面來判斷門的開啟或關閉狀態。不同sensor的廠商必須要提供IDoor介面,我們才可以將它安裝在門上面作為監控之用。

***

實作Dummy Object

接下來要練習的題目是「使用Dummy實作ICommand,測試Server.getCommandSize函數」。請鄉民們想一下,要如何讓下列測試案例通過?

螢幕截圖 2014-09-22 20.42.23


 

上面的測試案例期待getCommandSize()回傳2,也就是代表有兩個ICommand物件向Server註冊。因此只要呼叫server.addCommand()兩次就可以讓測試案例通過。但是addCommand函數需要一個ICommand物件作為參數,先是看看直接傳入null可不可以。

螢幕截圖 2014-09-22 20.51.44

 

執行結果失敗,看來addCommand函數有檢查傳入的ICommand物件不能是null。

螢幕截圖 2014-09-22 20.55.02

***

為了透過addCommand函數向Server註冊兩個ICommand物件,必須要傳入一個非null的ICommand物件進去。這個ICommand物件可以沒有任何的實作邏輯,只是為了符合addCommand的介面所需而產生的物件。請參考下列的DummyCommand實作。

螢幕截圖 2014-09-22 20.57.34

 

有了DummyCommand之後,就可以使用它來完成測試案例。

螢幕截圖 2014-09-22 21.00.38

 

執行結果通過,完成Dummy Object練習。

螢幕截圖 2014-09-22 21.01.30

***

友藏內心獨白:這算打假球嗎?

2 則留言:

  1. 請問,實作Dummy Object這一段的
    "接下來要練習的題目是「使用Dummy實作ICommand,測試Server.addCommandSize函數」"
    是不是有打錯字呢?是否為測試Server.getCommandSize函數?

    回覆刪除
    回覆
    1. Hi Wales,

      謝謝指正,的卻是測試Server.getCommandSize函數,錯誤以修正。

      刪除