2010-04-27 31 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,但它不解压缩。