如何使用Mockito.mockedStatic模拟静态void方法(不使用doNothing或invocation ->null)?

bxjv4tth  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(742)

我有以下课程

class FileDownloader {
    public static void downloadFile(String repoUrl, String filename) throws IOException {
        // Downloads file from internet
    }
}

class FileDownloaderAndProcessor {
    public static void downloadAndProcessFile() throws IOException {
        //run some processing to figure out what to download
        FileDownloader.downloadFile(a, b);
        //run various processing on downloaded file
    }
}

我曾经用PowerMockito.doAnswer模拟FileDownloader,在那里我基本上可以通过将本地文件从一个位置复制到另一个位置来模拟downloadFiles函数,以模拟下载,然后对后处理运行各种测试

PowerMockito.doAnswer(invocation -> {
//copy from local location x to y depending on arguments
}.when(FileDownloader.class, "downloadFile").etc etc

由于最近的 Spring 升级,我们不能再使用powermock并且正在迁移到MockedStatic。但是,我在MockedStatic中没有看到doAnswer功能。我真的不希望测试需要互联网连接才能运行。我该如何模拟这个void方法呢?
Mockito版本:您可以使用以下代码:org.mockito:mockito核心:jar:4.0.0 org.mockito:mockito内联:jar:4.0.0

ux6nzvsh

ux6nzvsh1#

您可以在Mockito提供的MockedStatic上试用when...thenAnswer...

try (MockedStatic<FileDownloader> mockedFileDownloader = Mockito.mockStatic(FileDownloader.class)) {
    mockedFileDownloader.when(() -> FileDownloader.downloadFile(repoUrl, filename))
        .thenAnswer(invocation -> {
            // copy from local location x to y depending on arguments
            return null;
        });
}
qjp7pelc

qjp7pelc2#

因为所有的静态类似乎只有一个方法,所以可以简单地模拟整个类。

Mockito.mockStatic(FileDownloader.class, invocationOnMock -> {
    System.out.println("Do Something that simulates the download");
    return null;
});

FileDownloader.downloadFile("someRepo", "someFile");

编辑:

只模仿类中的一个方法也可以通过一个简单的解决方案来实现。

MockedStatic<FileDownloader> your_mocked_call = mockStatic(FileDownloader.class, invoca -> {
        if (invoca.getMethod().getName().equals("downloadFile")) {
            // custom code here
            System.out.println("aaaaaaaaaaaaaaaaaaa");
        }
        return null;
    });

不过我建议使用Kai-Sheng Yang提供的解决方案https://stackoverflow.com/a/72125083/10254476。这是mockito的缩进方式。我原来的简单方法只是简单,只要整个类都可以被模仿。

**始终记得调用your_mocked_call.close();,否则静态模拟即使在testClass完成后仍保持打开状态。

相关问题