前言:
最近在写 UT(单元测试) 的过程中,遇到需要 Mock 出 FileInputStream 的情况,在这里分享一下自己的解决方案。
- 需要 Mock 的类:
public class Class1 { public Class1() { } public boolean method1() { try { FileInputStream fileInputStream = new FileInputStream("file.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); return false; } return true; }}
- 测试类如下:
@RunWith(PowerMockRunner.class)@PrepareForTest(Class1.class)public class Class1Test { @Test public void method1Test() throws Exception { Class1 class1 = new Class1(); FileInputStream fileInputStreamMock = mock(FileInputStream.class); whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStreamMock); boolean expected = true; boolean actual = class1.method1(); assertEquals(expected, actual); }}
注意:
在单元测试中我使用了 **@PrepareForTest(Class1.class)**,而没有使用 @PrepareForTest(FileInputStream.class)
3. 如果需要实际读取一个文件时,例如要读取 resources 目录下的某个文件,可以将代码修改为如下所示:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Class1.class)
public class Class1Test {
@Test
public void method1Test() throws Exception {
Class1 class1 = new Class1();
String path = new File(getClass().getClassLoader().getResource("file.txt").getFile()).getCanonicalPath();
FileInputStream fileInputStream = new FileInputStream(path);
whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStreamMock);
boolean expected = true;
boolean actual = class1.method1();
assertEquals(expected, actual);
}
}
PS:补充一下自己的pom依赖
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
</dependencies>
本文转载自: https://blog.csdn.net/JonTang/article/details/125789143
版权归原作者 JonTang 所有, 如有侵权,请联系我们删除。
版权归原作者 JonTang 所有, 如有侵权,请联系我们删除。