Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 控制台输入和输出的JUnit测试_Java_Junit_Io_Console_User Input - Fatal编程技术网

Java 控制台输入和输出的JUnit测试

Java 控制台输入和输出的JUnit测试,java,junit,io,console,user-input,Java,Junit,Io,Console,User Input,我只有一个主要方法。如何使用JUnit检查System.out.println()并替换扫描仪以自动输入值 请提供一些解决方案 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] arr = new int[4]; for (int i = 0; i < arr.length; i++) { arr[i] = scanner

我只有一个主要方法。如何使用JUnit检查System.out.println()并替换扫描仪以自动输入值

请提供一些解决方案

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int[] arr = new int[4];

    for (int i = 0; i < arr.length; i++) {
        arr[i] = scanner.nextInt();
    }

    for (int i = 0; i < arr.length; i++) {
        int res = 0;
        int k = 0;
        int num = arr[i];
        /*.....*/
        System.out.println(num);
    }
}
publicstaticvoidmain(字符串[]args){
扫描仪=新的扫描仪(System.in);
int[]arr=新的int[4];
对于(int i=0;i
理想情况下,提取笨拙的依赖项,以便在没有它们的情况下进行测试。将
main
更改为:

public static void main(String[] args) {
  doWork(new Scanner(System.in), System.out);
}

// TODO: Rename to something meaningful
public static void doWork(Scanner input, PrintStream output) {
  // Remainder of code
}
(对于
输出
,考虑使用
编写器
而不是
打印流


然后,您实际上不需要单元测试
main
——但是您可以使用基于
StringReader
Scanner
和基于
StringWriter
的输出来测试
doWork
,提供您想要的任何输入并检查输出。

我遇到了一个类似的问题,这就是我最终要做的事情

首先,我建议按照@jonskeet的建议去做,不要使用类的
main(String[])
方法,而是创建一个单独的方法

然后,您可以让该方法将
InputStream
作为参数,然后在方法内创建一个
Scanner
对象,该对象使用传递的
InputStream
作为其源。这样,您可以在调用方法时将任何
InputStream
,例如
System.in
,传递给该方法(如下)

package my.package;
进口。。。;
公共类MyClass
{
公共静态void myMethod(InputStream InputStream)
{
扫描仪inputScanner=新扫描仪(inputStream);
//用扫描仪做一些事情,比如。。。
字符串输入=inputScanner.nextLine();
System.out.println(“您输入”+输入);
}
}
现在,在产品源代码中,您可以调用
myMethod
并将其作为参数传递给
System.in
myMethod(System.in)

然后在单元测试中,您可以通过
ByteArrayInputStream
创建模拟输入值:

package my.package;
进口。。。;
公共类MyClassTest
{
@试验
void testMyMethod()
{
//模拟用户输入字符串“模拟输入”并按enter键
assertDoesNotThrow(myMethod(新的ByteArrayInputStream(“Mock input\n”.getBytes())));
}
}
瞧,您现在有了一种方法来传递您的方法模拟输入,而且它总体上更加模块化


我只想指出,在使用
系统时,在使用输入流时,需要小心关闭它和单元测试,在重复使用对同一
InputStream
的引用时需要小心,因为它的状态可以在不同的使用中保持不变。

我想学习如何使用它,例如,如何使用它来获得与多个信息提示相对应的多个输入?我有相同的问题。如果你发现了什么,请告诉我@阿曼:对不起,我以前一定没看过这篇评论。您将提供一个
扫描器
,基本上返回您希望用户输入的所有值。谢谢。但我使用了系统规则库