[英]PowerMock won't mock static method to throw an Exception in a Spring-Boot application
我意識到有很多非常相似的問題。 我已經經歷了所有這些,但我仍然無法使我的代碼工作。
我在 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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.