2015-10-20 69 views
0

我有一個類,其中用戶在終端窗口上進行交互,並在某些選項中鍵入,並根據這些選項進行切換並使用某些方法;我需要使用掃描儀來檢測用戶輸入。如何模擬掃描儀的用戶輸入?

我試了幾天做一個測試類來模擬用戶輸入,但我找不到合適的方法來做,因爲我無法模擬掃描儀的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上,因爲它是遞歸方法,直到給出某個選項來終止程序。

+0

*「這是一次嘗試,導致掃描程序出現nullPointerException - 因爲沒有檢測到輸入」* Stacktrace? – Tom

+0

*「它在TEMP-2停止,因爲它是遞歸方法,直到給出某個選項來終止程序。」*那麼,爲什麼不提供該特定選項作爲輸入而不是使用空字符串? – Tom

+0

爲什麼不使用'new Scanner(new File(「simulatedUserInput.txt」))'而不是試圖模擬'System.in'? –

回答

0

您是否嘗試過重新分配System.in?

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

我做了,這種方法讓我更進了一步,但在第二次嘗試時,它給出了錯誤,因爲某些方法會將用戶帶到另一個需要鍵入某些數據的菜單,並且在那裏失敗。 –

+0

您也可以模擬多行輸入。而不是「數據」,該字符串變成了,比如說,「(line1」+ System.lineSeparator()+「line2」)' – ThatOneCloud

0

這個想法背後的根本原因是有缺陷的。我假設你想要做類似

scanner.read(2); 

但是,掃描儀被設計爲從InputStreams讀取,如標準輸入和文件。它需要一個源讀取和一個常數,如2是一個簡單的無效來源。

如果您在調用readLine()時使用的方法是輸入2作爲輸入,也會出現問題。掃描儀只有在您調用讀取方法時纔開始讀取,並且只有在完成讀取後纔會停止。所以如果你要做

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

代碼永遠不會到達第二行。如果你是做

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

掃描儀絕不會看到「喜」,因爲它之前的掃描儀的閱讀餵養。

您可能可以設置某種只輸出常量「hi」的流,但僅從System.in或文件模擬輸入實際上更實用。

你也可以設置變量爲什麼會被輸入!例如:

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

我可能會嘗試從文件中進行掃描,僅僅是爲了測試它而沒有我的交互,但它可能是我測試的答案;我會回來的 –

+0

對不起,我耽擱了,我使用txt文件作爲輸入進行排序,並在需要時使用scannerNextLine()。感謝您的時間。因爲我沒有足夠的聲望,我無法給你厚厚的。 –