我們將從構建簡單的駝鹿監視軟件開始示例各種場景下的測試驅動開發。
鹿是鹿家族中的最大個的成員。目前世界上估計有2百萬頭。為了更好的統計,世界駝鹿組織讓我們開發一個駝鹿監視軟件,希望保護人員能夠跟蹤和記錄他們見到的駝鹿。
雖然駝鹿最長可以生存25年,但大部分駝鹿在年青的時候就被捕殺,通常只活了2、3年。根據世界駝鹿組織報告,我們想知道某一年齡后的駝鹿數據,因此我們增加了isOlderThan(int)方法。
單元測試如下:
public void testIsOlderThan() {
Moose moose = new Moose(new Date(), MOOSE_AGE);
assertTrue("Moose age "+ MOOSE_AGE +" should of been older than "+ TEST_AGE, moose.isOlderThan(TEST_AGE) );
}
方法:
boolean isOlderThan(int contenderAge) {
return this.age >= contenderAge;
}
這是一個普通的junit測試用例,這種方式通常用在測試驅動的開發中。這種完全獨立的方法一般是很少的;通常我們都需要一些代價昂貴的或比較難構建的外部資源。
使用偽對象和jMock
觀察駝鹿的最佳時間是在黎明和黃昏,跟其他動物的觀察時間相似。WOM希望我們提供獲取記錄駝鹿被發現的時間的保護人員,這樣就可以通過String getObserverName()來獲取相應的駝鹿了。
不幸地是,保護人員的接口來自第三方接口PersonnelUnit,而這是個大家伙沒有LDAP我們是無法構造的。
為了測試getObserverName(),我們可以啟動LDAP服務器,發送數據,運行測試用例,然后再關閉LDAP。但那將是集成測試,而不是單元測試了,對我們來說寧可多寫些代碼。因此,我們創建了一個包含我們需要方法的Ranger接口:
public interface Ranger {
String getName();
}
這給我們第一個啟發式的單元測試:用接口分離外部依靠。
我們需要改變Moose的構造函數增加Ranger參數。于是變成:
... above as before...
private Ranger observer;
public Moose( Date dateTimeObservedParam,
int estimatedAge,
Ranger observedBy)
{
this.dateTimeObserved = dateTimeObservedParam;
this.age = estimatedAge;
this.observer = observedBy;
}
... below as before ...
新聞熱點
疑難解答