2010-04-27 53 views
3

能合理單元測試被用於此代碼,其通過它委託給一個能夠工具(如果存在)在主機系統上提取RAR存檔書面? 我可以根據我的機器上運行Linux和安裝的unrar工具,但事實寫一個測試情況下,如果誰運行Windows的另一個開發人員將檢查出的測試代碼會失敗,但不會有什麼不妥提取碼。 我需要找到一種方法來編寫一個有意義的測試,而不是綁定到系統和unrar工具安裝。 你將如何解決這個問題?明智的單元測試可能嗎?

public class Extractor { 

private EventBus eventBus; 
private ExtractCommand[] linuxExtractCommands = new ExtractCommand[]{new LinuxUnrarCommand()}; 
private ExtractCommand[] windowsExtractCommands = new ExtractCommand[]{}; 
private ExtractCommand[] macExtractCommands = new ExtractCommand[]{}; 

@Inject 
public Extractor(EventBus eventBus) { 
    this.eventBus = eventBus; 
} 

public boolean extract(DownloadCandidate downloadCandidate) { 
    for (ExtractCommand command : getSystemSpecificExtractCommands()) { 
     if (command.extract(downloadCandidate)) { 
      eventBus.fireEvent(this, new ExtractCompletedEvent()); 
      return true; 
     } 
    } 

    eventBus.fireEvent(this, new ExtractFailedEvent()); 
    return false; 
} 

private ExtractCommand[] getSystemSpecificExtractCommands() { 
    String os = System.getProperty("os.name"); 
    if (Pattern.compile("linux", Pattern.CASE_INSENSITIVE).matcher(os).find()) { 
     return linuxExtractCommands; 
    } else if (Pattern.compile("windows", Pattern.CASE_INSENSITIVE).matcher(os).find()) { 
     return windowsExtractCommands; 
    } else if (Pattern.compile("mac os x", Pattern.CASE_INSENSITIVE).matcher(os).find()) { 
     return macExtractCommands; 
    } 

    return null; 
} 

}

回答

6

你能不能通過類Map<String,ExtractCommand[]>情況,然後作出一個抽象的方法,說GetOsName,用於獲取字符串相匹配。那麼您可以在地圖中查找匹配字符串以獲取getSystemSpecificExtractCommands方法中的提取命令。這將允許你注入一個列表包含模擬ExtractCommand並覆蓋GetOsName方法來回報您的模擬命令的關鍵,所以你可以測試,當提取工作中,eventBus燒製等

private Map<String,EvenetCommand[]> eventMap; 

@Inject 
public Extractor(EventBus eventBus, Map<String,EventCommand[]> eventMap) { 
    this.eventBus = eventBus; 
    this.eventMap = eventMap; 
} 

private ExtractCommand[] getSystemSpecificExtractCommands() { 
    String os = GetOsName(); 
    return eventMap.Get(os); 
} 

protected GetOsName(); 
{ 
    return System.getProperty("os.name"); 
} 
+0

+1注入「OS」的地圖命令也將是我的建議以及 – 2010-04-27 20:56:25

1

開始用模擬框架。您需要重構一下,因爲您需要確保某些私有和本地範圍屬性/變量可以在需要時被覆蓋。

然後,當你正在測試提取物,你要確保你已經嘲笑了命令,並確保提取方法被調用你的嘲笑對象。你也想確保你的事件也被解僱了。

現在,使其更容易測試,您可以使用構造函數或財產注入。無論哪種方式,您都需要使私有ExtractCommand數組可以被覆蓋。

對不起,沒有時間重新編寫它,職位,但應該只是讓你開始很好。

好運。

編輯。如果你想測試它是否被正確提取,它聽起來像是你在功能測試之後更多。

1

測試可能會非常棘手,特別是在不同類型的測試之間劃分權限,以及何時應該運行測試以及它們的職責是什麼。跨平臺代碼更是如此。

雖然有可能將其視爲您正在測試的1個代碼庫,但它確實是多個代碼庫,即每個目標平臺的通用Java代碼和代碼,因此您需要多個測試。

要使用單元測試開始,你將不會被行使的外部命令。相反,每個特定於平臺的類都經過測試,看它是否會生成正確的命令行,而不會實際執行它。

您的隱藏所有平臺特定信息(要使用哪個命令)的java類具有單元測試,以驗證它是否爲給定平臺實例化了正確的平臺特定類。該平臺可以成爲核心測試的參數,因此可以「模擬」多個平臺。要進一步進行單元測試,可以嘲笑命令實現(例如,將RAR文件和它的未壓縮格式作爲測試數據的一部分,並且該命令是未壓縮數據的簡單副本。)

一旦這些單元測試到位並且是綠色的,然後你可以繼續進行功能測試,在那裏執行真正的平臺特定命令。當然,這些功能測試必須在實際平臺上運行。每個功能測試都對應於一個平臺特定的類,它知道如何創建正確的命令行以unrar。

您的版本配置爲排除不適用於當前平臺的類的測試,例如,因此LinuxUnrarer未在Windows上進行測試。獨立於平臺的Java類總是經過測試,它將實例化適當的平臺特定測試。這爲您提供了一個集成測試,以查看系統是否端到端工作。

至於跨平臺UNRAR,有一個java RAR scanner,但它不解壓縮。