Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果使用mock,那么在此场景中进行单元测试的目的是什么_Java_Unit Testing_Mocking - Fatal编程技术网

Java 如果使用mock,那么在此场景中进行单元测试的目的是什么

Java 如果使用mock,那么在此场景中进行单元测试的目的是什么,java,unit-testing,mocking,Java,Unit Testing,Mocking,我有一个关于单元测试的问题。我想了好几天,都找不到答案 比如说,我有一个从web服务下载文件并将其写入磁盘的功能。在看不到文件下载并写入磁盘的情况下测试它的目的是什么 虽然我知道我们可以模拟web服务,但是在这种情况下我怎么做呢?据我所知,类似Mockito的东西只模拟行为,而不提供有意义的数据(本例中的文件) 即使我们可以模拟web服务的行为,我如何能够模拟将文件写入磁盘而不真正将某些内容写入磁盘 很抱歉,我没有具体的例子。请随意发表你的意见 非常感谢我总是说单元测试使代码更加模块化,因为它迫

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

比如说,我有一个从web服务下载文件并将其写入磁盘的功能。在看不到文件下载并写入磁盘的情况下测试它的目的是什么

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

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

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


非常感谢

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

在您的情况下,当您想要测试像将文件写入磁盘这样的东西时,相反,您可以让编写文件的方法只与
OutputStream
进行交互,这将确保您只需将
ByteArrayOutputStream
传递给函数,而不是实际的
FileOutputStream
,然后可以将字节转换为字符串,并检查内容是否与实际内容匹配期待

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

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

正如您所提到的,如果只是从某个web服务获取数据并将其写入文件,那么测试此函数可能没有多大意义。但是,如果它智能地处理数据,或者当web服务交互引发异常时,预期它会做些什么,那么测试它将是一件有趣的事情

比如说,我有一个从web服务下载文件并将其写入磁盘的功能。在看不到文件下载并写入磁盘的情况下测试它的目的是什么

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


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

+1很好的答案-使用临时文件绝对是好的,我想说的一件事是确保您的测试在之后删除它们,以防止它们累积(在调查CI服务器的磁盘为何已满时,这是一个惨痛的教训…@robjohncox您始终可以确保对正在创建的文件调用
deleteOnExit
)。