通常我有这些方法负责将大文件下载到本地目录。
这让我很烦,因为我真的不知道如何正确地测试 ?
我是否应该在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
}
答案 0 :(得分:2)
我的信念是,你正在以错误的方式解决问题。
您想测试“该方法是否有效”。但是这种方法在很大程度上取决于“副作用”,在这种情况下,可能会出现以下任何一个步骤的失败:
简而言之:无法测试方法是否“有效”。而且,由于上面提到的可能失败的数量,这意味着你的方法应该至少抛出异常,以便方法的调用者可以处理它。
最后,这是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()
...您可以模拟该方法的行为,无论您想要哪种方式,以便您可以测试调用者这种方法的行为。
但是这种方法本身就过于依赖“副作用”而无法可靠地进行测试。