问题:
在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版权协议,转载请附上原文出处链接和本声明。