我意识到有很多很多非常相似的问题。我已经经历了所有这些,但我仍然无法使我的代码工作。
我在 Spring-Boot 应用程序中定义了一个服务,就像这样:
@Service
public class FileStorageService {
private final Path fileStorageLocation;
@Autowired
public FileStorageService(final FileStorageProperties fileStorageProperties) {
//FileStorageProperties is a very simple class that right now just holds one String value
this.fileStorageLocation = Paths.get(fileStorageProperties.getUploadDir())
.toAbsolutePath()
.normalize();
try {
Files.createDirectories(fileStorageLocation);
} catch (IOException e) {
// FileStorageException is my custom, runtime exception
throw new FileStorageException("Failed to create directory for stored files", e);
}
}
}
我想测试场景,当目录创建失败时,我需要模拟方法 Files.createDirectories()。我的测试课如下所示:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.IOException;
import java.nio.file.Files;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Files.class})
public class FileStorageServiceTest {
private static final String UPLOAD_DIR = "uploadDir";
@Test(expected = FileStorageException.class)
public void some_test() throws IOException {
PowerMockito.mockStatic(Files.class);
PowerMockito.when(Files.createDirectories(Mockito.any())).thenThrow(new IOException());
new FileStorageService(createFileStorageProperties());
}
private FileStorageProperties createFileStorageProperties() {
final FileStorageProperties fileStorageProperties = new FileStorageProperties();
fileStorageProperties.setUploadDir(UPLOAD_DIR);
return fileStorageProperties;
}
}
我相信我遵循了我所阅读的教程和问题中的每一步。 我用:
尽管如此,测试过程中没有抛出任何异常,并且失败了。将非常感谢您的帮助,因为我觉得我错过了一些非常简单的东西,只是看不到它。
来自:https://github.com/powermock/powermock/wiki/Mock-System
通常,您会准备包含您想要模拟的静态方法(我们称之为 X)的类,但由于 PowerMock 不可能准备用于测试的系统类,因此必须采取另一种方法。因此,您不需要准备 X,而是准备调用 X 中静态方法的类!
基本上,我们模拟类对 System 类的使用,而不是不可模拟的 System 类本身。
@PrepareForTest({Files.class})
在不模拟任何系统类的情况下执行此操作的另一种非 Powermock 方法是创建一个辅助方法,@Spy 原始类,并专门模拟该辅助方法以引发异常。
when(spy.doSomethingWithSystemClasses()).thenThrow(new Exception("Foo"));