如何模拟Scanner的用户输入?

时间:2015-10-20 19:52:56

标签: java testing system.in

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

我试了几天做一个测试类来模拟用户输入,但我找不到合适的方法来做,因为我无法模拟扫描仪的System.in,也没有找到任何具体的信息,我有看到有关缓冲的事情,但我无法使用它。

这是一次尝试,导致扫描程序出现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处停止,因为它是递归方法,直到给出终止程序的某个选项。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这个想法背后的根本原因是有缺陷的。我假设你想做一些像

这样的事情
scanner.read(2);

但是,Scanner旨在从InputStreams中读取,例如标准输入和文件。它需要一个源来读取,而一个常量(如2)只是一个无效的源。

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

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

代码永远不会到达第二行。如果你要做

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

扫描仪永远不会看到“hi”,因为它是在扫描仪读取之前送入的。

您可以设置某种仅输出常量“hi”的流,但是从System.in或文件中自己模拟输入更为实用。

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

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