我被要求在从命令行运行和运行的遗留Java应用程序中引入单元测试。基本上主循环打印出一个菜单,用户输入内容并显示更多数据。JUnit围绕Sytem.in和System.out进行测试
这个主类说明了应用程序是如何工作的。
public class Main{
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String argv[]) throws IOException{
while (true) {
char input = (char) reader.read();
if(input == 'x'){
return;
}
System.out.println(input);
}
}
}
我想我的测试方法是这个样子
public void testCaseOne(){
Main.main();
String result = "";
result = sendInput("1");
assertEqual(result, "1");
result = sendInput("x");
assertEqual(result,"");
}
我知道的System.setOut()
和System.setIn()
方法,但我不能想出一个办法,使System.setIn()
方法工作这种情况下,因为reader.read()
方法阻止我的线程。
我的测试设计是否错误? 有没有办法设计sendInput()
方法来完成阻塞reader.read()调用?
如果您希望您的代码在标准输入上进行侦听,同时也将测试代码写入标准输入,那么顺序代码将不够用。我相信你需要两个线程。一个用于Main.main(),另一个用于sendInput(“1”); – mjshaw 2013-02-25 22:05:43
您是否正在测试reader.read()执行正确的操作,还是在传递'x'时while循环退出? – 2013-02-25 22:53:31
我甚至会超越Threads,开始使用ProcessBuilder作为自己的进程测试应用程序。这样你就不需要担心重定向任何东西 – radai 2013-02-25 23:02:37