Junit单元测试之含有控制台输入输出的函数

问题:

在Java的单元测试中,针对需要控制台输入或需要向控制台输出的函数,如何做到测试自动化?

解决:重定向输入流、输出流

1. 测试含有控制台输入的函数

利用jdk自带的:System.setIn(InputStream in):重新分配“标准”输入流,相当于不是从控制台获取数据,而是从该流中获取数据。而对于字符串可以先转为字节数组,然后转成流,ByteArrayInputStream(byte buf[])继承自InputStream,可以作为System.setIn()方法的参数。
被测函数:
单测脚本:

2. 测试含有控制台输出的函数

被测函数:
在这里插入图片描述单侧脚本:

replaceAll("\r\n",""):去除字符串的回车换行符,因为System.out.println() 自动在字符串末尾加入了换行
如果是调用了System.out.print()函数的话:outContent.toString() 即可。

测试类和单测脚本的完整代码

SystemTest.java

package character;

import java.util.Scanner;

/**
 * @author 1111
 */
public class SystemTest {

    public SystemTest(){};


    /**
     * 需要控制台输入的函数
     */
    public int getInput(){
        int result;
        Scanner scanner = new Scanner(System.in);
        result = scanner.nextInt();
        return result;
    }

    /**
     * 需要向控制台输出的函数
     */
     public void getOutput(String a){
         System.out.println(a);
     }

}

SystemTestTest.java

package character;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;

import static org.junit.Assert.*;

public class SystemTestTest {
    private SystemTest systemTest;

    @Before
    public void setUp() throws Exception {
        systemTest = new SystemTest();
    }

    @After
    public void tearDown() throws Exception {
        systemTest = null;
    }

    @Test
    public void getInput() {
        String input = "0";
        int actual;
        //记录“标准”输入流(控制台输入)
        InputStream stdin = System.in;
        try{
            //重新分配“标准”输入流
            System.setIn(new ByteArrayInputStream(input.getBytes()));
            actual = systemTest.getInput();
        }finally {
            //还原“标准”输入流(控制台输入)
            System.setIn(stdin);
        }
        assertEquals(0,actual);

    }

    @Test
    public void getOutput() {
        //记录“标准”输出流(控制台输出)
        PrintStream console = System.out;
        final  ByteArrayOutputStream outContent = new ByteArrayOutputStream();
        try{
            //重新分配“标准”输出流
            System.setOut(new PrintStream(outContent));
            systemTest.getOutput("1");
        }finally {
            //还原“标准”输出流(控制台输出)
            System.setOut(console);
        }

        assertEquals("1",outContent.toString().replaceAll("\r\n",""));

    }
}

版权声明:本文为weixin_43307006原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。