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 模拟文件。在spring引导单元测试中复制_Java_Unit Testing_Mockito - Fatal编程技术网

Java 模拟文件。在spring引导单元测试中复制

Java 模拟文件。在spring引导单元测试中复制,java,unit-testing,mockito,Java,Unit Testing,Mockito,我试图在单元测试用例中模拟以下函数: Files.copy(response.getBody(), pathObj, StandardCopyOption.REPLACE_EXISTING); StandardCopyOption是java.nio.file包的枚举: 我试图嘲弄的方式是: try { Mockito.doNothing().when(Files.copy(Mockito.any(InputStream.class), Mockito.any(Path.

我试图在单元测试用例中模拟以下函数:

Files.copy(response.getBody(), pathObj, StandardCopyOption.REPLACE_EXISTING);
StandardCopyOption
java.nio.file
包的枚举:

我试图嘲弄的方式是:

    try {
        Mockito.doNothing().when(Files.copy(Mockito.any(InputStream.class), Mockito.any(Path.class), Mockito.any(CopyOption.class)));
    }catch (Exception e){
        e.printStackTrace();
    }
但我得到了以下错误:

    org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
0 matchers expected, 3 recorded:
-> at scheduler.DownloadTest.downloadFile(DownloadTest.java:227)
-> at scheduler.DownloadTest.downloadFile(DownloadTest.java:227)
-> at scheduler.DownloadTest.downloadFile(DownloadTest.java:227)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

问题是您试图模拟静态方法。莫基托不允许这样。您只能为实际模拟类实例的非静态方法提供行为

当你使用

Mockito.doNothing().when(Files.copy(Mockito.any(InputStream.class), Mockito.any(Path.class), Mockito.any(CopyOption.class)));
在when()方法中,mockito期望引用您试图模拟的类。然后,您需要指定方法及其参数

例如:

但是,由于在本例中copy是一个静态方法,上述方法将不起作用(在代码中,您提供Files.copy的返回值作为类引用)。因此,一种解决方案是要么使用PowerMock(它可以模拟静态方法,但与mockito的更高版本不兼容),要么将Files类包装在实例包装器中

例如:

现在,将一个模拟的FileWrapper实例(Mockito.mock(fileWrapper.class))注入到代码中,并在使用Files.copy的任何地方使用它。由于mockito的默认行为是不对被模拟类实例的方法执行任何操作,因此您只需要创建模拟


另一种选择是将Files.copy部分移动到受测试类的受保护方法中。然后,可以在测试期间重写此受保护的方法。

问题在于您试图模拟静态方法。莫基托不允许这样。您只能为实际模拟类实例的非静态方法提供行为

当你使用

Mockito.doNothing().when(Files.copy(Mockito.any(InputStream.class), Mockito.any(Path.class), Mockito.any(CopyOption.class)));
在when()方法中,mockito期望引用您试图模拟的类。然后,您需要指定方法及其参数

例如:

但是,由于在本例中copy是一个静态方法,上述方法将不起作用(在代码中,您提供Files.copy的返回值作为类引用)。因此,一种解决方案是要么使用PowerMock(它可以模拟静态方法,但与mockito的更高版本不兼容),要么将Files类包装在实例包装器中

例如:

现在,将一个模拟的FileWrapper实例(Mockito.mock(fileWrapper.class))注入到代码中,并在使用Files.copy的任何地方使用它。由于mockito的默认行为是不对被模拟类实例的方法执行任何操作,因此您只需要创建模拟


另一种选择是将Files.copy部分移动到受测试类的受保护方法中。然后可以在测试期间重写此受保护的方法。

是否可以改用内存中的文件系统?mdewit完全正确;您不能使用Mockito来模拟静态方法(也许您想花一些时间阅读Mockito文档;这些东西在这里已经清楚地说明了)。因此,只有两种选择:使您的不可测试设计可测试;遵循这个答案;或者转到PowerMock(ito)。我强烈建议您选择第一个选项。您能改用内存文件系统吗?mdewit完全正确;您不能使用Mockito来模拟静态方法(也许您想花一些时间阅读Mockito文档;这些东西在这里已经清楚地说明了)。因此,只有两种选择:使您的不可测试设计可测试;遵循这个答案;或者转到PowerMock(ito)。我强烈建议你选择第一个选项。
class FilesWrapper {
   public long copy(InputStream in, Path target, CopyOption... options) {
      return Files.copy(in, target, options);
   }
}