命令行程序的特点
与其它应用程序相比,基于cmd-line的程序有以下几个特点:
- 启动文件带参数
- 通过std.in进行输入
- 通过std.out,std.err进行输出
问题
如果你想使用junit进行测试而不是每次都手工的在黑色的cmd中测试的话,就需要解决与之对应的这几个问题:
- 如何在junit中启动main函数?
- 如何向std.in中输入测试数据?
- 如何从std.out/std.err中读取结果?
程序样例
1.如何在junit中启动main函数?
程序代码
public class Demo {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
String string = args[i];
P.rintln("NO." + i + "'s parameter is " + string);
}
}
}
测试代码
@Test
public void testMain() {
String[] strings = {"save","c:\\"};
Demo.main(strings);
}
调用main()函数的感觉和普通的静态方法基本一致。
2.如何向std.in中输入测试数据?
测试代码
@Test
public void testMain() {
String data = "Hello, World!\r\n";
InputStream stdin = System.in; //保存原始的标准输入
try {
System.setIn(new ByteArrayInputStream(data.getBytes()));//重定向,这里核心代码,重定向到其它的流中
ReadLineFromSystemIn.main(null);//调用应用程序
} finally {
System.setIn(stdin); //还原
}
}
3.如何从std.out/std.err中读取结果
测试代码
@Test
public void testMain2() {
String data = "lalala\r\nlalalala\r\n";
String expected = "read line 1: lalala\\s+read line 2: lalalala";
InputStream stdin = System.in;
PrintStream stdout = System.out;// 保存原有的
try {
System.setIn(new ByteArrayInputStream(data.getBytes()));// 重定向输入
ByteArrayOutputStream baos = new ByteArrayOutputStream();
System.setOut(new PrintStream(baos));// 重定向输出
ReadLineFromSystemIn.main(null);// 打好桩后,应用程序启动
assertTrue(Regexp.isLike(expected, baos.toString()));
} finally {
System.setOut(stdout);// 还原
System.setIn(stdin);
}
}