PowerMock 不会模拟静态方法在 Spring-Boot 应用程序中抛出异常

问题描述 投票:0回答:1

我意识到有很多很多非常相似的问题。我已经经历了所有这些,但我仍然无法使我的代码工作。

我在 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());.

尽管如此,测试过程中没有抛出任何异常,并且失败了。将非常感谢您的帮助,因为我觉得我错过了一些非常简单的东西,只是看不到它。

java spring-boot mockito powermockito
1个回答
1
投票

来自: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"));
© www.soinside.com 2019 - 2024. All rights reserved.