当前位置: 首页 > 知识库问答 >
问题:

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

融烨磊
2023-03-14
@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);
        }
    }
}
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;
    }
}
    null

但是,在测试过程中没有抛出异常,并且失败。我会非常感谢你的帮助,因为我觉得我错过了一些很简单的东西,只是看不到它。

共有1个答案

薛博赡
2023-03-14

来自:https://github.com/powermock/powermock/wiki/mock-system

通常,您会准备包含要模拟的静态方法的类(我们称之为X),但是因为PowerMock不可能准备系统类进行测试,所以必须采取另一种方法。因此,不准备X,而是准备调用X中静态方法的类!

基本上,我们模仿类对System类的使用,而不是不可模仿的System类本身。

@PrepareForTest({Files.class})
when(spy.doSomethingWithSystemClasses()).thenThrow(new Exception("Foo");
 类似资料:
  • 编辑: 感谢所有的回复。我找到了解决办法。我试图模拟一个方法findById,它不是直接在User.class中,而是在用户扩展的genericModel.class中。现在一切都很完美。

  • 我不知道我的代码出了什么问题,我的静态方法都不能被 Mockito 嘲笑...... 我检查了几个小时,似乎我的代码没有任何错误。 下面是依赖性: 下面是静态方法: 下面是测试类: 运行测试后,我得到了这个异常:

  • 我正在尝试使用JUnit、Mockito和PowerMock验证对的调用。 下面是我的测试用例: 下面是测试中的代码: 非常有趣的是,这段代码失败时出现:

  • 我正在使用Spring Boot,并试图使我的静态资源(CSS,JS,字体)在部署时可用。源代码可供您查看或从https://github.com/joecracko/StaticResourceError.克隆 现在我的CSS、JS和字体文件对我部署的网站不可见。 下面是我的项目目录结构: 下面是编译后的JAR的根目录:我向您保证,这些文件存在于各自的文件夹中。 以下是我看到的网络错误: 以下是

  • Powermock为什么不模拟静态方法调用,而是在然后()语句中调用初始方法? 在这种情况下,我有一系列方法调用: TestClass方法-调用- Class4方法尝试查找上下文中不存在且挂起的对象,因此我尝试使用Powermock模拟公共静态Class3方法。 所有的类和方法都是非最终的。我使用TestNg。我的测试方法有一个@准备测试我尝试了以下方法来模拟方法调用: 或而不是当-然后返回: 或

  • 我想知道是否有一种方法来验证和调用一个模拟,该模拟是为一个私有静态方法创建的,该私有静态方法是从一个被测试的公共静态方法调用的。 下面是我正在测试的公共静态方法 我已经使用powermokito对私有静态方法进行了如下嘲弄: