Java 下载的单元测试

Java 下载的单元测试,java,unit-testing,download,integration-testing,Java,Unit Testing,Download,Integration Testing,我正在编写一个Java程序,下载并处理许多网页。测试下载页面而不点击远程服务器的程序组件的最佳实践是什么?一种想法是使用“InputStream”作为传递给处理代码的对象。我相信用于通过HTTP读取数据的HttpClient(或等效类)类为您提供了某种在响应上读取的流。对于测试,您可以替换一种不同类型的流来读取,例如本地文件流。因此进行下载的组件和处理页面的组件应该是单独的。当您在单元测试一段代码时遇到问题,这表明您可能试图在一个组件中做得太多了 一旦您完成了这项工作,您就可以测试处理部分了。让

我正在编写一个Java程序,下载并处理许多网页。测试下载页面而不点击远程服务器的程序组件的最佳实践是什么?

一种想法是使用“InputStream”作为传递给处理代码的对象。我相信用于通过HTTP读取数据的HttpClient(或等效类)类为您提供了某种在响应上读取的流。对于测试,您可以替换一种不同类型的流来读取,例如本地文件流。

因此进行下载的组件和处理页面的组件应该是单独的。当您在单元测试一段代码时遇到问题,这表明您可能试图在一个组件中做得太多了

一旦您完成了这项工作,您就可以测试处理部分了。让处理器组件接受一个InputStream,甚至只是一个字符串作为输入


至于下载部分,您可能需要进行集成测试。集成测试通常要复杂得多,需要设置一个本地web服务器(maven可以做到这一点),或者至少使用一个文件:URL。

如果您的代码支持HTTP代理,您可以使用一个作为代理的网络外缓存。只需使用代理缓存运行代码一次,保存数据、网络延迟等。然后,您可以使用代理运行代码,只返回数据。在两者之间切换只是配置HTTP代理的问题


这种方法的优点是可以针对任意数量的站点进行单元测试。您的网络缓存/http代理将可重复使用,以备将来使用。

请查看依赖项注入
这是一种将不同的“依赖项”注入到函数中的技术,而不是从函数中开始(简单的解释)

阅读Martin Fowlers关于DI的文章

希望能有所帮助

/Jonas

如果您使用的是设计良好的http客户端,您应该能够模拟它,因此不需要为了测试代码中的所有方法而进行集成测试。尽管如此,无论如何,集成测试可能是一个好主意。