我对单元测试有疑问。我好几天都在考虑它,但找不到答案。
说,我有一个从Web服务下载文件并将其写入磁盘的功能。在没有实际看到文件被下载并写入磁盘的情况下测试它的目的是什么?
虽然我知道我们可以嘲笑网络服务,但我在这种情况下如何做到这一点?据我所知,像Mockito这样的东西只是嘲笑行为而不是提供有意义的数据(本例中的文件)。
即使我们可以模拟Web服务的行为,我如何模拟将文件写入磁盘而不是真正写入磁盘?
对不起,我没有具体的例子。请随时发表您的意见。
非常感谢
答案 0 :(得分:5)
我总是说单元测试你的代码使它更加模块化,因为它迫使你思考如何解耦这个类并单独测试它。
在您想要测试诸如将文件写入磁盘之类的情况下,您可以改为使您的方法编写文件以与OutputStream
交互。这将确保您只需传递{{1函数而不是实际ByteArrayOutputStream
然后您可以将字节转换为String并检查内容是否与您实际期望的内容相匹配。
也可以创建临时文件并传递临时文件的FileOutputStream
进行写入,然后可以检查文件的内容。
通过使方法与FileOutputStream
交互,可以使其与识别文件路径的过程分离,创建OutputStream
等。
正如您所提到的,如果只是从某个Web服务获取数据并将其写入文件,那么测试此函数可能没什么意义。但是,如果它在智能操作数据或预期在Web服务交互引发异常时执行某些操作,那么测试它会很有趣。
答案 1 :(得分:4)
说,我有一个从Web服务下载文件并将其写入磁盘的功能。在没有实际看到文件被下载并写入磁盘的情况下测试它的目的是什么?
没有。你不用单元测试来测试它。在这种情况下(与网络,文件系统,数据库的交互),您可以编写integration tests。它们通常使用类似的工具和框架来进行单元测试,但它们用于不同的目的 - 测试组件集成和它们之间的交互。集成测试通常模仿您的应用程序的实际使用情况。
如果您的所有功能都是调用一个服务/组件来下载文件而另一个服务/组件将其保存到磁盘,则在这种情况下单元测试相当有限。