2010-11-01 61 views
2

我有一個DeliveryScheduleParser類,它讀入電子表格並將其解析爲多個對象,這些對象最終都會在DeliveryScheduleParser類中的getClient()方法返回的客戶端對象中結束。如何對電子表格解析器進行單元測試?

public class DeliveryScheduleParser { 

    private final HashMap<String, Integer> _headerColumnNumbers; 
    private final File _file; 
    private HSSFSheet sheet; 
    private Client client; 

    public DeliveryScheduleParser(File file) { 
     this._file = file; 
     sheet = getSheet(_file); 
     _headerColumnNumbers = getHeaderMap(sheet); 
     parseSheet(); 
    } 

    public Client getClient(){ 
     return client; 
    } 

    // Other private methods here 
} 

這個類裏面的parseSheet()方法基本上完成了所有的工作,只要求一些靜態消毒方法,這些方法分別進行單元測試。

我的問題基本上是確保客戶端對象正確填充正確對象的最佳方法,並且這些對象反過來也填充了正確的對象(嵌套了很多ArrayLists在其他ArrayLists內)。

我還想針對不同數據的電子表格運行單元測試,以確保所有解析都是正確的。

回答

0

我猜這個場景是由兩套測試組成的。

  1. 您必須有一個名爲Client的接口。你應該嘲笑它,看看你的DeliveryScheduleParser是否正確地與它交互。所以首先嘲笑你的客戶並測試你的DeliveryScheduleParser。
  2. 現在從客戶端定義你的期望,並逐個寫下你的測試。然後實現實現了Client接口的類(如此ClientImpl)。

嘲笑你可能喜歡使用Mockito或任何嘲笑框架,以方便。

因此,基本上爲了能夠「確保客戶端對象正確填充正確的對象」,您必須測試您的Client,但不是立即測試DeliveryScheduleParser。其實你的DeliveryScheduleParser應該是一個合作者,並與Client互動。

然後你可能想以類似的方式分解這個實現,因爲它聽起來像這裏的對象相當耦合。

對於ArrayList您可能喜歡使用的接口List接口和模擬它。

針對不同電子表格進行測試是一項集成測試。還有,你可以用你可以在每個測試中提供不同的電子表格的方式來模擬你的文件提供者(這裏不清楚)。您可以將這些信息表添加到測試文件夾下的資源中,並可以使用reource loader加載測試表。我也會將這些測試與速度的單元測試分開。

我想更具體的,但希望它可以幫助...

0

由於類似乎真正的文件解析成對象世界中,我建議編寫集成測試 - 與鍛鍊你的課堂測試真實的文件。單元測試使用解析器的類型可以依賴角色/接口(並模擬它)。

您還可以將數據驅動/參數檢測的等效運行鍼對不同的輸入相同的測試(在這種情況下的文件)

理想解析責任應該駐留在一個類型/類。它應該接受輸入並生成另一種類型(數據結構/對象)作爲輸出。

相關問題