我需要从另一个java类中编译并运行一个java类,然后将一些东西输入到前者的控制台中 需要将测试类的(控制台)输出重定向到测试类。 我已经尝试了类似的东西,测试文件被给了一个文本文件而不是控制台输入,并且没有问题,这就是为什么我认为控制台输入必须是问题。
这是我到目前为止所提出的:
@testing
import java.io.*;
public class Test {
public static void main(String [] args) throws Exception{
Process javac = Runtime.getRuntime().exec("javac ToBeTested.java");
javac.waitFor();
Process process = Runtime.getRuntime().exec("java ToBeTested");
BufferedReader readFromProcess = new BufferedReader(new InputStreamReader(process.getInputStream ()));
BufferedReader errorFromProcess = new BufferedReader(new InputStreamReader(process.getErrorStream ()));
BufferedWriter writeToProcess = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
writeToProcess.write("Foo");
System.out.println("Foo written");
writeToProcess.write("FooBar");
System.out.println("FooBar written");
System.out.println("Tested Process:" +readFromProcess.readLine());
writeToProcess.write("Bar");
System.out.println("Bar written");
String line;
for (String line=readFromProcess.readLine(); line != null; line =readFromProcess.readLine()){
System.out.println("Tested Process:" +line);
}
process.waitFor();
}
}
@tested
import java.io.*;
public class ToBeTested {
public static void main(String[] args) throws IOException{
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
System.out.println("foo");
System.out.println(input.readLine());
System.out.println("fooBar");
}
}
现在输出如下:
Foo written
FooBar written
Tested Process:null
Bar written
另外,如果我注释掉
行writeToProcess.write("Bar");
程序将陷入
process.waitFor();
,可能是因为ToBeTested仍然需要某种输入。这是否意味着写入方法按预期工作?如果是这样的话:为什么输出不起作用?
请注意,ToBeTested类无法更改(甚至无法访问)。在ToBeTested中预期输入时获得某种通知也会很好,因为所需输入的数量和顺序可能会有所不同。