Java 如果使用mock,那么在此场景中进行单元测试的目的是什么
我有一个关于单元测试的问题。我想了好几天,都找不到答案 比如说,我有一个从web服务下载文件并将其写入磁盘的功能。在看不到文件下载并写入磁盘的情况下测试它的目的是什么 虽然我知道我们可以模拟web服务,但是在这种情况下我怎么做呢?据我所知,类似Mockito的东西只模拟行为,而不提供有意义的数据(本例中的文件) 即使我们可以模拟web服务的行为,我如何能够模拟将文件写入磁盘而不真正将某些内容写入磁盘 很抱歉,我没有具体的例子。请随意发表你的意见Java 如果使用mock,那么在此场景中进行单元测试的目的是什么,java,unit-testing,mocking,Java,Unit Testing,Mocking,我有一个关于单元测试的问题。我想了好几天,都找不到答案 比如说,我有一个从web服务下载文件并将其写入磁盘的功能。在看不到文件下载并写入磁盘的情况下测试它的目的是什么 虽然我知道我们可以模拟web服务,但是在这种情况下我怎么做呢?据我所知,类似Mockito的东西只模拟行为,而不提供有意义的数据(本例中的文件) 即使我们可以模拟web服务的行为,我如何能够模拟将文件写入磁盘而不真正将某些内容写入磁盘 很抱歉,我没有具体的例子。请随意发表你的意见 非常感谢我总是说单元测试使代码更加模块化,因为它迫
非常感谢我总是说单元测试使代码更加模块化,因为它迫使您思考如何将这个类解耦并单独测试它 在您的情况下,当您想要测试像将文件写入磁盘这样的东西时,相反,您可以让编写文件的方法只与
OutputStream
进行交互,这将确保您只需将ByteArrayOutputStream
传递给函数,而不是实际的FileOutputStream
,然后可以将字节转换为字符串,并检查内容是否与实际内容匹配期待
还可以创建一个临时文件,并将临时文件的FileOutputStream
传递给写入,然后可以检查文件的内容
通过使该方法与OutputStream
交互,可以使其与标识文件路径、创建FileOutputStream
等过程分离
正如您所提到的,如果只是从某个web服务获取数据并将其写入文件,那么测试此函数可能没有多大意义。但是,如果它智能地处理数据,或者当web服务交互引发异常时,预期它会做些什么,那么测试它将是一件有趣的事情
比如说,我有一个从web服务下载文件并将其写入磁盘的功能。在看不到文件下载并写入磁盘的情况下测试它的目的是什么
没有。你不能用单元测试来测试。在这种情况下(与网络、文件系统、数据库的交互),您可以编写。它们通常使用类似的工具和框架进行单元测试,但它们的用途不同——测试组件集成和组件之间的交互。集成测试通常模拟应用程序的实际使用情况
如果您的所有功能都是调用一个服务/组件来下载文件,然后调用另一个服务/组件将其保存到磁盘,那么在这种情况下,单元测试是相当有限的。+1很好的答案-使用临时文件绝对是好的,我想说的一件事是确保您的测试在之后删除它们,以防止它们累积(在调查CI服务器的磁盘为何已满时,这是一个惨痛的教训…@robjohncox您始终可以确保对正在创建的文件调用
deleteOnExit
)。