簡體   English   中英

具有偽造用戶輸入的Java測試掃描儀

[英]Java testing scanner with fake user input

我有一個static方法,該方法使用static final Scanner從控制台獲取用戶輸入。

測試時,我想創建多個具有不同輸入的測試(顯然)。 只要單獨運行測試,此方法就可以正常工作。 運行整個類是行不通的,因為(顯然)掃描器已經使用上一個測試的輸入進行了初始化,該輸入的行比第一個測試所需的行多。

我得到的具體錯誤是:

java.util.NoSuchElementException: No line found

這里有一些代碼需要澄清:

public class UserInputHandler {
    public static final Scanner SCANNER = new Scanner(System.in);
}

我正在嘗試測試的班級(和其他一些班級)正在使用上述Scanner查詢用戶。

我的測試:

InputStream in = new ByteArrayInputStream("test".getBytes());
System.setIn(in);
TestClass testclass = new TestClass();
testClass.method(); // Scanner is used in this method

如何使我的測試對多個TestClass實例起作用?

真正的問題在這里:

public class UserInputHandler {
    public static final Scanner SCANNER = new Scanner(System.in);
}

您正在強迫該輸入來自System.in 為什么不使用

public class UserInputHandler {
    public Scanner getScanner() {
      return new Scanner(someInputStream);

當然,現在您必須擔心someInputStream的來源,但是:您使自己變得更加靈活。

您的代碼實際上並不是在單個靜態對象上,而是會進行調用並接收從某處讀取的內容。 然后,在測試中,您只需定義輸入流,並確保可以使用這些輸入流(例如,通過使UserInputHandler類的字段在實例化該類時被設置)。

換句話說:真正的解決方案是更改生產代碼,以使其A)更加靈活並且B)易於測試。 您倒退了:您編寫了僵硬且難以測試的代碼,現在嘗試將測試用例調整為合理。

錯誤的方法:當您無法編寫簡單直接的測試時,則需要重新編寫生產代碼。 總是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM