IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 单元测试1 文件流单元测试 -> 正文阅读

[开发测试]单元测试1 文件流单元测试

单元测试1 文件流单元测试

书写文件处理函数的时候,最好输入输出写为流文件或者File格式,这样方便mock

File类型的单元测试

  1. File类在创建的时候不会验证路径的有效性,因此可以随便new一个File类
File file = new File("abc.txt");

当单元测试读进去之后,只有名字 ”abc.txt" 是存在的,但是后续处理过程中就会报

java.io.FileNotFoundException: xxx.xxx(系统找不到指定文件的异常)
  1. 也可以使用PowerMockito来mock一个虚拟File

PowerMockito使用时需要引入maven依赖

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.0</version>
    <scope>test</scope>
</dependency>
public class ParserTest {
@Test
   public final void testParse() {
      File MOCKEDFILE = PowerMockito.mock(File.class);
      PowerMockito.when(MOCKEDFILE.exists()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.isFile()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.isDirectory()).thenReturn(false);
      PowerMockito.when(MOCKEDFILE.createNewFile()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.length()).thenReturn(11111111L);
//what about the path of MOCKEDFILE which isn't existing
      PowerMockito.when(MOCKEDFILE.getPath()).thenReturn(?????);
   }

FileInputStream类型的单元测试

1.FileInputStream流概念

FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等

2.构造方法

2.1 通过打开与File类对象代表的实际文件的链接来创建FileInputStream流对象

public FileInputStream(File file) throws FileNotFoundException{}

若File类对象的所代表的文件不存在;不是文件是目录;或者其他原因不能打开的话,则会抛出

java.io.FileNotFoundException: xxx.xxx(系统找不到指定文件的异常)

2.2 通过指定的字符串参数来创建File类对象,而后再与File对象所代表的实际路径建立链接创建FileInputStream流对象

public FileInputStream(String name) throws FileNotFoundException

实际上源码是先将name转换为file类,然后在读取为FileInputStream对象

 public FileInputStream(String name) throws FileNotFoundException {
 	this(name != null ? new File(name) : null);
 }

2.3 通过FileDecscriptor文件描述符来作为参数,文件描述符是指与计算机系统中的文件的连接,前面两个方法的源码中最后都是利用文件描述符来建立连接的(设计计算机系统,暂时不理解)

public FileInputStream(FileDescriptor fdObj) 

3.单元测试

当在函数里面用到FileInputStream的时候可以使用

@PrepareForTest(Parser.class)
public class ParserTest {
@Test
   public final void testParse() {
      File MOCKEDFILE = PowerMockito.mock(File.class);
      PowerMockito.when(MOCKEDFILE.exists()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.isFile()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.isDirectory()).thenReturn(false);
      PowerMockito.when(MOCKEDFILE.createNewFile()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.length()).thenReturn(11111111L);
//what about the path of MOCKEDFILE which isn't existing
      PowerMockito.when(MOCKEDFILE.getPath()).thenReturn(?????);
//how to assign a File an FileInputStream? (I thought something like)
      PowerMockito.mockStatic(FileInputStream.class);
      FileInputStream MOCKEDINPUTSTREAM = PowerMockito.mock(FileInputStream.class);
      PowerMockito.whenNew(FileInputStream.class).withArguments(File.class).thenReturn(MOCKEDINPUTSTREAM);
//how to mock the private method readMyStream
   }

@PrepareForTest(Class1.class)是必须的,否则

PowerMockito.whenNew(FileInputStream.class).withArguments(File.class).thenReturn(MOCKEDINPUTSTREAM);

不能代替构造器创建新的FileInputStream。

回答:https://stackoverflow.com/questions/51205275/how-to-mock-fileinputstream-with-powermock

相似的流类型(exp:FileOutputStram,ZipOutputStream之类的都可以使用相同方法来实现)

不过有时候会不起作用,具体原因没找到,改着改着就好了,但不是@PrepareForTest的原因,后续遇到继续总结

示例:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamClassDemo {
    public void demo1(File file) throws IOException {
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] b=new byte[(int) file.length()];
        fileInputStream.read(b);
        fileInputStream.close();
        System.out.println(new String(b));
    }
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import static org.junit.Assert.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest({InputStreamClassDemo.class})
public class InputStreamClassDemoTest {

    @InjectMocks
    InputStreamClassDemo inputStreamClassDemo;
    @Test
    public void demo1() throws Exception {
        File file = PowerMockito.mock(File.class);
        PowerMockito.when(file.length()).thenReturn(3L);
        FileInputStream mock = PowerMockito.mock(FileInputStream.class);
        PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(mock);
        inputStreamClassDemo.demo1(file);
    }
}
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 19:06:55  更:2021-09-11 19:07:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:38:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码