2013-07-22 44 views
1

我有一個類,它應該將數據從一種格式轉換爲另一種格式(數據庫到庫類型)。它看起來像:轉換器類測試驅動

public LibraryType convertToLibrary(Database db, Parameters params) { 

    Preconditions.checkNotNull(db," missing database for conversion"); 
    Preconditions.checkNotNull(params, "missing parameters for conversion"); 

    LibraryType lib = basicFactory.createLibraryType(); 
    lib.setName(db.getName()); 
    ComponentType type = convertStructure(db.getStructure(),params); 

    if (type != ComponentType.EMPTY) { 
     lib.addComponent(type); 
    } 

    return lib; 
} 

ComponentType convertStructure(Structure s, Parameters params) { 

    if (!params.isStructureAllowed(s)) return ComponentType.EMPTY; 

    ComponentType comp = basicFactory.createComponentType();  
    comp.setName(s.getName()); 
    return comp; 
} 

我有這個概念的兩個問題。

  1. 的方法convertStructure應該是私有的,因爲它時並不需要從外部調用它,但是出於測試目的,我將它定義包範圍內,這看起來並不那麼好看

  2. 參數(params)被傳遞給子方法。實際上,我會使用一個類的字段,可以在構造函數中插入,但由於使用guice作爲DI框架,我無法將這些數據傳遞給構造函數。參數將在運行時更改。所以我需要將它作爲方法參數傳遞。我可以將它設置爲convertToLibrary方法中的類字段,但是我無法測試convertStructure方法。

我遇到了設計問題還是有任何有用的解決方法?將它分成不同的類別是否有意義,這對我來說聽起來不太好,因爲我仍然認爲這是班級(轉換數據)的一項責任(SRP)?

感謝您的幫助

回答

1

回答問題1(或許還有第2題):

如果你覺得你需要編寫一個測試convertStructure(),我認爲這是一個標誌,它應該是在其自己的班級。一項測試不應該測試小一點的責任(IMO)。

這就是說,我不確定你需要單獨測試convertStructure()。是不是測試convertLibrary()夠了?或者也許是一個更大的單位?

意見:我喜歡在外面測試,在高層次測試,以便在需要時開始測試較小的零件。從系統用戶開始測試行爲,並僅在需要時測試實施細節。不是所有人都同意我的看法。

+0

這不是全班。在convertStructure中,稍後會有另一個調用,用於轉換結構的子元素等等。所以最終可能會發生,你將會有5個不同的if語句(在每種方法中可能只有一個),這樣它會增加測試方法的數量 – SimFirehawk

+0

它可能發生。但也許它不會。 TDD的方式是做最好的一刻。一旦你發現新的東西,改變/適應測試和/或生產代碼的新知識。 –