如果使用模拟,在这种情况下进行单元测试的目的是什么

问题描述:

我有一个关于单元测试的问题。我一直在想这个问题好几天,却找不到答案。如果使用模拟,在这种情况下进行单元测试的目的是什么

说,我有一个功能,从Web服务下载文件并将其写入磁盘。测试它的目的是什么,没有真正看到文件被下载并写入磁盘?

虽然我明白我们可以嘲笑Web服务,但我怎么能在这种情况下做到这一点?据我所知,像Mockito这样的东西只会模拟行为,但不会给出有意义的数据(在这个例子中是文件)。

即使我们可以嘲笑Web服务的行为,我怎么可以在没有真正写入磁盘的情况下将文件写入磁盘?

对不起,我没有具体的例子。请随时发表您的意见。

非常感谢

我总是说,单元测试代码使它更加模块化,因为它迫使你想我怎么可以断开这个类,并在隔离测试。

在你的情况下,当你想测试像写入文件到磁盘的东西,你可以改变你的方法写文件来与简单的OutputStream进行交互。这将确保你可以简单地将ByteArrayOutputStream传递给函数,而不是实际FileOutputStream然后,您可以将字节转换为字符串,并检查内容是否与您的实际期望相符。

也可以创建临时文件并传递临时文件的FileOutputStream进行写入,随后可以检查文件的内容。

通过使该方法与OutputStream互动,你把它从确定的文件路径的过程中分离,创建FileOutputStream

正如你提到的,它可能没有多大意义,如果它来测试这个功能只是从某些Web服务获取数据,并将其写入文件。但是,如果智能操纵数据或者在Web服务交互引发异常时预计会做某些事情,那么测试它会很有趣。

+0

启发答案 – goh 2012-08-13 02:29:08

+0

+1好答案 - 临时文件的使用绝对是好的,我想说的一件事就是确保你的测试后来删除它们,以防止它们建立起来(在调查为什么CI服务器有一个完整的磁盘...) – robjohncox 2013-08-14 13:32:54

+0

@robjohncox你总是可以确保在正在创建的文件上调用'deleteOnExit'。 – 2013-08-21 12:11:57

说,我有一个功能,从Web服务下载文件并将其写入磁盘。测试它的目的是什么,没有真正看到文件被下载并写入磁盘?

没有。你不用单元测试来测试。在这种情况下(与网络,文件系统,数据库的交互),您可以编写integration tests。他们经常利用类似的工具和框架来进行单元测试,但他们有不同的目的 - 测试你的组件集成和它们之间的交互。集成测试通常模仿您的应用程序的实际使用情况。

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