2011-03-31 183 views
1

這已被問過,但沒有澄清到我得到它的地步。與我在這個主題上看到的其他一兩個線程類似,我正在使用命令行輸入來登錄/關閉,斷開連接等工作,並且我不確定如何在JUnit測試中對其進行模擬案件。其他回覆表明我應該嘗試將System.in更改爲單獨的InputStream,但是......然後呢? dr:我在我的實際代碼中有一個用於解析命令行輸入的方法,並且需要JUnit測試方法,輸入並正確處理這些方法。JUnit命令行測試

回答

1

編輯:看來我誤解了這個問題。我通常使用術語「命令行輸入」來指代給予流程開始的命令行參數,而不是交互式控制檯輸入。然而...

漢鼎你真正的代碼,通過使用不同的InputStream甚至可能是一個ReaderScanner的確會幫助 - 任何以「讓輸入」部分從控制檯中分離出來。然後,您可以非常容易地將輸入僞裝成一行,在測試代碼中使用字符串作爲輸入,然後將其轉換爲字節並將這些字節包裝到ByteArrayInputStream中或直接將字符串包裝到StringReader中。

這樣做的不足之處在於,爲了檢查結果,在一個命令後面做這個「暫停」並沒有簡單的方法。

您可能要有所改變設計,使得其讀取部分輸入來自哪個處理輸入部分分離。閱讀部分可能是一個非常簡單的循環,順序上:

String line; 
while ((line = reader.readLine()) != null) { 
    handleInput(line); 
} 

然後,您可能會離開的那部分未經測試的單元測試,或者寫一些比較原始的測試 - 但你可以再測試handleInput廣泛,如它現在與輸入源分離。


原來的答覆

如果你提取從真正啓動應用程序的代碼解析的代碼,很容易:運行該代碼,並檢查結果。當然,如果你有某種封裝選項的類,這將是最簡單的。例如,您main方法可能是這樣的:

public static void main(String[] args) { 
    Options options = Options.parse(args); 
    // Use options here 
} 

然後,你可以測試Options.parse變得非常容易。

+0

我可能只是有一個史詩般的brainfart,但我不認爲這真的回答了我的問題。我可以在我的JUnit測試用例中啓動「Welcome,請輸入命令:」循環,但是如何從前面提到的沒有主要方法的測試用例輸入命令? – 2011-03-31 06:05:47

+0

@尼克:啊,我明白了。通過「命令行輸入」,我認爲你的意思是命令行參數......而你的意思是交互式控制檯輸入。將編輯。 – 2011-03-31 06:11:03

+0

我認爲把閱讀與處理分開是我的方法。有一個接受字符串參數的方法,所以我可以在JUnit中手動傳遞它,這將使我的生活變得輕鬆。謝謝。 – 2011-03-31 06:22:45

相關問題