如何测试下载大文件的方法

时间:2016-02-23 21:28:08

标签: java junit

通常我有这些方法负责将大文件下载到本地目录。

这让我很烦,因为我真的不知道如何正确地测试

我是否应该在Junit中运行使用Role将这些文件下载到临时目录的测试用例?或者可能要求它将文件下载到生产中的同一本地目录中?

重要的是,这种方法需要很长时间才能下载1GB +文件,因此测试用例需要很长时间才能解决问题吗?

这对于理想的测试案例是什么?

public File downloadFile(File dir, URL url){
   //url contains a 1GB or more
   //method takes a long time
   return file; // it's located in dir
}

1 个答案:

答案 0 :(得分:2)

我的信念是,你正在以错误的方式解决问题。

您想测试“该方法是否有效”。但是这种方法在很大程度上取决于“副作用”,在这种情况下,可能会出现以下任何一个步骤的失败:

  • 连接失败:无法访问给定的URL(无论出于何种原因);
  • 网络故障:传输正在进行时切断连接;
  • 文件系统故障:无法在写入模式下创建/打开指定的文件;或者在下载内容时写入失败。

简而言之:无法测试方法是否“有效”。而且,由于上面提到的可能失败的数量,这意味着你的方法应该至少抛出异常,以便方法的调用者可以处理它。

最后,这是2016年;下面假设您使用的是Java 7或更高版本,但以下是您可以重写方法的方法:

public Path downloadFile(final Path dir, final URL url)
    throws IOException
{
    final String filename = /* decide about the filename here */;
    final Path ret = dir.resolve(filename);

    try (
        final InputStream in = url.openStream();
    ) {
        Files.copy(in, ret);
    }

    return ret;
}

现在,在您的测试中,只需模拟该方法的行为;让它失败,让它返回一个有效的路径,让URL失败.openStream() ...您可以模拟该方法的行为,无论您想要哪种方式,以便您可以测试调用者这种方法的行为。

但是这种方法本身就过于依赖“副作用”而无法可靠地进行测试。