Java如何Mock FileInputStream问题

 更新时间:2023年09月21日 14:38:28   作者:JonTang  
这篇文章主要介绍了Java如何Mock FileInputStream问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java如何Mock FileInputStream

1. 最近在写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;
    }
}

2. 测试类如下

@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>

Java mockito mock InputStream

方案

使用apache commons的IOUtils直接构造一个基于String的InputStream,一些文本传输相关的测试的场景里非常实用。

Process mockProcess = mock(Process.class);
InputStream errorStream = org.apache.commons.io.IOUtils.toInputStream("error message", "UTF-8");
when(mockProcess.getErrorStream()).thenReturn(errorStream);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot注册拦截器所遇到的问题

    springboot注册拦截器所遇到的问题

    这篇文章主要介绍了springboot注册拦截器的方法及所遇到的问题,需要的朋友可以参考下
    2018-07-07
  • SpringCloud Stream使用解析

    SpringCloud Stream使用解析

    这篇文章主要介绍了SpringCloud Stream介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java8中Map的一些骚操作总结

    java8中Map的一些骚操作总结

    这篇文章主要给大家介绍了关于java8中Map的一些骚操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • SpringBoot中@RestControllerAdvice注解实现全局异常处理类

    SpringBoot中@RestControllerAdvice注解实现全局异常处理类

    这篇文章主要介绍了SpringBoot中@RestControllerAdvice注解全局异常处理类,springboot中使用@RestControllerAdvice注解,完成优雅的全局异常处理类,可以针对所有异常类型先进行通用处理后再对特定异常类型进行不同的处理操作,需要的朋友可以参考下
    2024-01-01
  • Springboot中设置时间格式问题小结

    Springboot中设置时间格式问题小结

    本文主要介绍了Springboot中设置时间格式问题小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Java单例模式实现静态内部类方法示例

    Java单例模式实现静态内部类方法示例

    这篇文章主要介绍了Java单例模式实现静态内部类方法示例,涉及构造函数私有化等相关内容,需要的朋友可以了解下。
    2017-09-09
  • Java中的栈概述及JVM 中的栈结构

    Java中的栈概述及JVM 中的栈结构

    栈是一种受限的线性数据结构,只能在一端(称为 栈顶(Top))进行插入和删除操作,本文给大家介绍Java中的栈概述深入理解JVM中的栈结构,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • SpringBoot集成SpringSecurity和JWT做登陆鉴权的实现

    SpringBoot集成SpringSecurity和JWT做登陆鉴权的实现

    这篇文章主要介绍了SpringBoot集成SpringSecurity和JWT做登陆鉴权的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • struts2过滤器和拦截器的区别分析

    struts2过滤器和拦截器的区别分析

    这篇文章主要介绍了struts2过滤器和拦截器的区别,简单分析了struts2框架中过滤器和拦截器的概念与相关使用区别,需要的朋友可以参考下
    2016-04-04
  • Java之Arrays的各种功能和用法总结

    Java之Arrays的各种功能和用法总结

    数组在 Java 中是一种常用的数据结构,用于存储和操作大量数据。Arrays 是我们在处理数组时的一把利器。它提供了丰富的方法和功能,使得数组操作变得更加简单、高效和可靠。接下来我们一起看看 Arrays 的各种功能和用法,,需要的朋友可以参考下
    2023-05-05

最新评论