Java 如何模拟扫描仪的用户输入?

Java 如何模拟扫描仪的用户输入?,java,testing,system.in,Java,Testing,System.in,我有一个类,在这个类中,用户在终端窗口上进行交互,并键入某些选项,基于这些选项,它进行切换并使用某些方法;我需要使用扫描仪来检测用户输入 我尝试了几天来制作一个测试类来模拟用户输入,但我找不到一个合适的方法来做,因为我无法模拟系统。对于扫描仪,我也没有找到任何具体的信息,我看到了一些关于缓冲的东西,但我无法使用它 这是一次尝试,它导致扫描仪出现nullPointerException,因为没有检测到输入。。我还试着睡觉,然后设置输入 如能为扫描仪模拟System.in,将不胜感激 public

我有一个类,在这个类中,用户在终端窗口上进行交互,并键入某些选项,基于这些选项,它进行切换并使用某些方法;我需要使用扫描仪来检测用户输入

我尝试了几天来制作一个测试类来模拟用户输入,但我找不到一个合适的方法来做,因为我无法模拟系统。对于扫描仪,我也没有找到任何具体的信息,我看到了一些关于缓冲的东西,但我无法使用它

这是一次尝试,它导致扫描仪出现nullPointerException,因为没有检测到输入。。我还试着睡觉,然后设置输入

如能为扫描仪模拟System.in,将不胜感激

public void test1addItem()
{
    InputStream input = new ByteArrayInputStream("".getBytes());
    String data1="1"; //Add an item option
    String data2="bread"; //The item to add

    input = new ByteArrayInputStream(data1.getBytes());
    //System.out.println("DATA1="+input);
    System.out.println("TEMP - 1");
    System.setIn(input);
    System.out.println("TEMP - 2");
    tsl.start(); //reference to the class which I am testing
    System.out.println("TEMP - 3");
    try {
        Thread.sleep(2000);
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    System.out.println("TEMP - 4");
    input = new ByteArrayInputStream(data2.getBytes());
    System.out.println("TEMP - 5");
    System.setIn(input);
    System.out.println("TEMP - 6");
}

它在TEMP-2处停止,因为它是一种递归方法,直到给出了终止程序的特定选项。

您是否尝试过重新分配System.in

System.setIn(new ByteArrayInputStream("data".getBytes()));

这一想法背后的基本推理是有缺陷的。我猜你想做点什么

scanner.read(2);
然而,扫描器被设计为从标准输入和文件等输入流中读取数据。它需要一个源来读取,像2这样的常量只是一个无效的源

如果在调用readLine()时使用将2作为输入的方法,也会出现问题。扫描仪仅在调用read方法时才开始读取,并且在完成读取之前不会停止。所以如果你要这么做的话

String s = scanner.readLine();
scanner.feed("hi");
scanner.feed("hi");
String s = scanner.readLine();
代码永远不会到达第二行。如果你要做

String s = scanner.readLine();
scanner.feed("hi");
scanner.feed("hi");
String s = scanner.readLine();
扫描仪永远不会看到“hi”,因为它是在扫描仪读取之前输入的

您可以设置某种只输出常量“hi”的流,但更实际的做法是自己模拟System.in或文件中的输入

您也可以将变量设置为输入的值!例如:

String s = "hi";   //scanner.readLine();

“这是一个尝试,它会导致扫描仪出现nullPointerException-因为没有检测到输入“Stacktrace?”它会在TEMP-2停止,因为它是一个递归方法,直到给出某个选项来终止程序。”那么,为什么不提供特定选项作为输入,而不是使用空字符串呢?为什么不使用
新扫描仪(新文件(“simulatedUserInput.txt”)
而不是尝试模拟
系统。在
中?现在每个人都在使用Scanner类,并且变得困惑,从“System.in”中读取输入流呢?我无法访问扫描仪,因此我无法更改其输入。我可能只是为了在没有交互的情况下进行测试而尝试从文件扫描,但这可能是我测试的答案;我会为这次巨大的耽搁感到后顾之忧,因为我不在家;我已经用一个txt文件作为输入进行了分类,并且在需要时使用scannerNextLine()。谢谢你抽出时间。我不能告诉你,因为我没有足够的声誉..我这样做了,这个方法让我更进一步,但在第二次尝试中,它给出了错误,因为某些方法会将用户带到另一个菜单,在那里它需要键入一些数据,但失败了..你也可以模拟多行输入。而不是“数据”,字符串变成,比如说,
(“line1”+System.lineSeparator()+“line2”)