Java 如何检查主方法的输出?

Java 如何检查主方法的输出?,java,testing,output,main,Java,Testing,Output,Main,例如,使用以下主要方法 public class Solution { public static void main(String []argv) { System.out.println("Hello World."); System.out.println("Hello Java."); } } 我想知道一个平台(例如Hackerrank)的代码如何检查main方法是否打印了预期的输出 Hello World. Hello Java. 乍一看

例如,使用以下主要方法

public class Solution {
   public static void main(String []argv)   {
       System.out.println("Hello World.");
       System.out.println("Hello Java.");
   }
}
我想知道一个平台(例如Hackerrank)的代码如何检查main方法是否打印了预期的输出

Hello World.
Hello Java.
乍一看,很难想象如何使用Junit实现这一点。 我相信外部程序正在检查输出,我的意思是这样的:

$ java Solution | runtests

谢谢

您的猜测,使用unix管道衬里肯定是一种可以做到的方法

在Java中,您可以通过运行
Java
命令并通过
InputStream

// Create and start the process
Process pb = new ProcessBuilder("java", "Solution").start();
// Create a reader to read in each output line
BufferedReader reader = new BufferedReader(new InputStreamReader(pb.getInputStream()));
String line;
// Read in line by line
while((line = reader.readLine()) != null) {
    // ...
}

请注意,
ProcessBuilder
start()
方法可以抛出一个
IOException
,因此您需要对此进行说明。

我也想过使用
ProcessBuilder
,但实际上要调用Java代码,最好的方法是直接调用它,不是吗?@Dici-Yeah,直接调用它可能是最好的方法,当然,只要您不担心编写的代码会干扰运行它的代码(通过单独进程运行的代码将在其自己的环境中)。是的,您的解决方案将跨越一个新的JVM。对于隔离目的来说,这可能是一件好事,但我想知道,对于一个需要评估大量解决方案的服务器来说,这是否是可持续的。也许这很好,也许不是,尽管我明白为什么在同一个JVM上运行两个解决方案会非常糟糕+1@Dici当大量使用JVM时,会产生大量的计算负载,这是一个很好的观点。是的,但公平地说,这可能是正确的做法。Codibility等网站根据其性能评估解决方案,结果可能会影响招聘决策,因此他们最好不要认为某个解决方案比实际慢,因为它可以在同一个JVM中作为速度非常慢的解决方案。在这里隔离很可能是必要的。