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);
}
}