本文是為ZDNet翻譯的系列文章之一,原文已經(jīng)發(fā)表在ZDNet網(wǎng)站
單元測試的普及已經(jīng)增長,部分原因是極限編程(eXtreme Programming)的增長,然而編寫強大的單元測試是令人厭煩的事情。對象仿制通過偽造需要測試的目標的周圍的對象來幫助減少你的工作,然后使用它檢查和需要測試的目標相關(guān)的調(diào)用。
EasyMock是 創(chuàng)建那些偽造對象的快速的方法,同時它會保持單元測試的能力。EasyMock 的通常用法是:
1. 為一個接口創(chuàng)建一個偽造對象
2. 訓(xùn)練那個接口告訴它期望的調(diào)用以及需要得到的反應(yīng)
3. 測試目標并驗證偽造的對象
這里有測試一個方法的范例,Mapper.map(Processor, Integer[]),map方法對數(shù)組中的每個整數(shù)調(diào)用Processor.process 方法:
public void testArrayProcessing() throws java/lang/Exception.java.html" target="_blank">Exception {
Integer[] numbers = new Integer[2] {
new Integer(6),
new Integer(7)
};
// 創(chuàng)建偽造對象
MockControl control = EasyMock.controlFor (Processor.class);
Processor mockProcessor = (Processor)control.getMock();
// 訓(xùn)練對象
mockProcessor.process (numbers[0]);
control.setReturnValue (new Integer(1));
mockProcessor.process (numbers[1]);
control.setReturnValue (new Integer(1));
// 開始
control.activate ();
// 運行測試
Mapper.map(mockProcess, numbers);
// 驗證測試
control.verify();
}
調(diào)用control 的verify 方法很重要,否則訓(xùn)練的一半不能被測試。例如如果我們已經(jīng)指定那個方法必須返回整數(shù)’1’,那么調(diào)用verify方法確保返回的確實是那個值。
訓(xùn)練過程中的方法調(diào)用的順序沒有影響,但是我們可以指定一個方法只能被調(diào)用指定的次數(shù):
//假設(shè)Processor接口有一個setName方法,并且
// 我們的類 Mapper,對每個項目都調(diào)用那個方法一次
mockProcessor.setName("Test");
control.setVoidCallable(3);
當(dāng)我們調(diào)用verify方法,它會檢查setName 被調(diào)用了多少次,如果那個方法被調(diào)用得太頻繁會報告一個錯誤。
EasyMock的主要局限性是只能工作于接口上,但是使用接口是一個好的設(shè)計習(xí)慣,這沒有什么可抱怨的。
EasyMock可以節(jié)省很多費力的工作并使得可以更快的編寫單元測試。可以從網(wǎng)上下載EasyMock,還有一個關(guān)于對象仿制的論文和其他的對象仿制API的鏈接。