簡體   English   中英

PowerMock 不會模擬靜態方法在 Spring-Boot 應用程序中拋出異常

[英]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;
    }
}

我相信我遵循了我讀過的教程和問題的每一步。 我用:

  1. @RunWith(PowerMockRunner.class),
  2. @PrepareForTest({Files.class}),
  3. PowerMockito.mockStatic(Files.class),
  4. 和 PowerMockito.when(Files.createDirectories(Mockito.any())).thenThrow(new IOException());。

盡管如此,在測試期間沒有拋出異常並且它失敗了。 將非常感謝您的幫助,因為我覺得我錯過了一些非常簡單的東西,只是看不到它。

來自: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM