gpt4 book ai didi

java - Spring Boot 单元测试中的 Mocking Files.copy

转载 作者:行者123 更新时间:2023-12-02 02:57:09 25 4
gpt4 key购买 nike

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

Files.copy(response.getBody(), pathObj, StandardCopyOption.REPLACE_EXISTING);

StandardCopyOptionjava.nio.file 包的枚举:

我试图 mock 的方式是:

    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 不允许这样做。您只能为实际模拟类实例的非静态方法提供行为。

当您使用时

Mockito.doNothing().when(Files.copy(Mockito.any(InputStream.class), Mockito.any(Path.class), Mockito.any(CopyOption.class)));

在when()方法中,mockito期望引用您尝试模拟的类。然后,您需要指定方法及其参数。

例如:

Mockito.doNothing().when(classInstance).copy(...)

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

例如:

class FilesWrapper {
public long copy(InputStream in, Path target, CopyOption... options) {
return Files.copy(in, target, options);
}
}

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

另一种选择是将 Files.copy 部分移动到被测类的 protected 方法中。然后可以在测试期间覆盖此 protected 方法。

关于java - Spring Boot 单元测试中的 Mocking Files.copy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42897815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com