3

我有一个关于单元测试的问题。想了好几天,也没有找到答案。

比如说,我有一个从 Web 服务下载文件并将其写入磁盘的功能。在没有实际看到文件已下载并写入磁盘的情况下对其进行测试的目的是什么?

虽然我知道我们可以模拟 Web 服务,但是在这种情况下我该怎么做呢?据我所知,像 Mockito 这样的东西只能模拟行为,但不提供有意义的数据(本例中的文件)。

即使我们可以模拟 Web 服务的行为,我如何模拟将文件写入磁盘而不真正向磁盘写入内容?

很抱歉,我没有具体的例子。请随时发表您的意见。

非常感谢

4

2 回答 2

5

我总是说对你的代码进行单元测试会使它更加模块化,因为它迫使你思考如何解耦这个类并单独测试它。

在您的情况下,当您想要测试诸如将文件写入磁盘之类的东西时,您可以改为让您的方法写入文件以与简单的 a 交互OutputStream这将确保您可以简单地将 a 传递ByteArrayOutputStream给函数而不是实际的FileOutputStream您然后可以获得bytes 转换为 String 并检查内容是否与您实际期望的匹配。

也可以创建一个临时文件并传递FileOutputStream临时文件的写入,然后您可以检查文件的内容。

通过使该方法与 进行交互OutputStream,您可以使其与识别文件路径、创建FileOutputStream等的过程分离

正如您所提到的,如果只是从某个 Web 服务获取数据并将其写入文件,那么测试此功能可能没有多大意义。但是如果它智能地操纵数据或者当 Web 服务交互抛出异常时期望做某事,测试它会很有趣。

于 2012-04-19T18:57:48.547 回答
4

比如说,我有一个从 Web 服务下载文件并将其写入磁盘的功能。在没有实际看到文件已下载并写入磁盘的情况下对其进行测试的目的是什么?

空无一人。你不用单元测试来测试它。在这种情况下(与网络、文件系统、数据库的交互),您编写集成测试。他们经常使用类似的工具和框架来进行单元测试,但它们服务于不同的目的——测试你的组件集成和它们之间的交互。集成测试通常会模仿您的应用程序的实际使用情况。

如果您的所有功能只是调用一个服务/组件来下载文件并调用另一个服务/组件将其保存到磁盘,那么在这种情况下单元测试是相当有限的。

于 2012-04-19T19:09:55.330 回答