4

我想使用以下测试代码对 java.nio.file.Files 中的公共静态函数readAllBytes进行存根。

@PrepareForTest(Files.class)
public void testGetNotExistingRestFile() throws Exception {
    PowerMockito.mockStatic(Files.class);
    PowerMockito.doThrow(mock(IOException.class)).when(Files.readAllBytes(any(Path.class)));
}

每次抛出 NullPointerException 时,我都能弄清楚我做错了什么。

java.lang.NullPointerException
at java.nio.file.Files.provider(Files.java:67)
at java.nio.file.Files.newByteChannel(Files.java:317)
at java.nio.file.Files.newByteChannel(Files.java:363)
at java.nio.file.Files.readAllBytes(Files.java:2981)
at nl.mooij.bob.RestFileProviderTest.testGetNotExistingRestFile(RestFileProviderTest.java:53)

如何使用 PowerMockito 存根来自 java.nio.file.Files的函数readAllBytes ?

4

3 回答 3

3

调用 Mockito,而不是 PowerMockito 并反转存根顺序:

@Test(expected=IOException.class)
@PrepareForTest(Files.class)
public void testGetNotExistingRestFile() throws Exception {
    // arrange
     PowerMockito.mockStatic(Files.class);
     Mockito.when(Files.readAllBytes(Matchers.any(Path.class))).thenThrow(Mockito.mock(IOException.class));
    // act
     Files.readAllBytes(Mockito.mock(Path.class));
}

另一种可能是:

   @Test(expected=IOException.class)
   @PrepareForTest(Files.class)
   public void testGetNotExistingRestFile() throws Exception {
     // arrange
       PowerMockito.mockStatic(Files.class);
       Files filesMock = PowerMockito.mock(Files.class);
       Mockito.when(filesMock.readAllBytes(Matchers.any(Path.class))).thenThrow(Mockito.mock(IOException.class));
     // act   
       filesMock.readAllBytes(Mockito.mock(Path.class));
   }

参考:使用 PowerMockito 模拟最终和静态方法

于 2015-09-18T02:26:54.093 回答
3

确保将调用静态方法的类包含在@PrepareForTest.

@PrepareForTest({Files.class, ClassThatCallsFiles.class})
于 2017-05-23T00:22:55.590 回答
0

请在 pom.xml 中添加此依赖项,同时为静态方法模拟文件类。

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-core</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>

这也是您获得 NullPointerException 的因素之一

于 2021-03-23T11:30:10.560 回答