【问题标题】:What is the purpose of unit testing at this scenario if mock is used如果使用模拟,在这种情况下进行单元测试的目的是什么
【发布时间】:2012-04-19 18:49:06
【问题描述】:

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

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

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

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

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

非常感谢

【问题讨论】:

    标签: java unit-testing mocking


    【解决方案1】:

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

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

    也可以创建一个临时文件,将临时文件的FileOutputStream传递给写入,随后可以查看文件内容。

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

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

    【讨论】:

    • +1 好的答案 - 使用临时文件绝对是好的,我要说的一件事是确保您的测试之后删除它们以防止它们堆积(在调查时学到了一个教训为什么 CI 服务器有一个完整的磁盘...)
    • @robjohncox 您始终可以确保在正在创建的文件上调用deleteOnExit
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2022-11-17
      • 2011-11-26
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多