[英]JMock - how to mock console output
這篇文章是類似於: 此
我有一個控制台應用程序,它既需要用戶輸入,又需要響應用戶輸出。 我正在為此編寫一些單元測試,以確保代碼正常工作。 我需要確保其輸出和輸入與我期望的一樣。
本質上,我有一個正在測試的主要方法要求輸入文件或輸入。 在我的測試中,我使用System.setOut
和System.setIn
分別將它們設置為PrintStream對象和InputStream對象的context.mock版本。 我不關心要進行什么System.out.println
調用,直到我必須測試程序數據的實際處理,然后才將其結果輸出到控制台。 總結一下:
這是我正在測試的消息源(有些東西已經關閉,我做了很多刪節 ): http : //ideone.com/rptC0
這是我的模擬過程中的內容: http : //ideone.com/VkvqM
這是我得到的例外: ideone.com/OEOS8
正如您在期望中可以清楚看到的那樣,我明確地說是我打算打印出完全相同的字符串,並在期望中指定了該字符串。 但例外情況表明這是出乎意料的。 我不明白
JMock的希望您在使用申報的期望context.checking()
然后調用被測代碼, 然后調用context.assertIsSatisfied()
雖然有時最后一步是隱式進行,如果使用適當的測試運行)。
您似乎在運行任何代碼之前立即調用context.assertIsSatisfied()
。
另外,您發布的代碼使用的變量mn
似乎沒有定義-實際上是您正在運行的代碼嗎? 還是該變量應該mockIn
?
更新 :好的,問題可能出在您嘗試模擬靜態方法-JMock不支持此方法-請參見jmock模擬靜態方法 。 特別是來自JMock作者之一的史蒂夫·弗里曼(Steve Freeman)的答案。
更新2 :我會嘗試這樣的事情,在@Before設置中設置期望值:
@Before
public void setMinimalMockingExpectations() throws IOException
{
oldIn = System.in;
oldOut = System.out;
pipe = new PipedOutputStream();
testIn = new PipedInputStream(pipe);
mockOut = context.mock(PrintStream.class);
System.setOut(mockOut);
System.setIn(testIn);
expectQuestion();
}
private void expectQuestion()
{
Expectations exp = new Expectations()
{
{
one(mockOut).println(main.QUESTION);
}
};
context.checking(exp);
}
@After
public void reset()
{
System.setIn(oldIn);
System.setOut(oldOut);
}
@Test
public void fileChoiceReturnsFalse() throws IOException
{
String FILE = "F\n";
pipe.write(FILE.getBytes());
assertFalse(main.promptStringOrFile());
context.assertIsSatisfied(); // can avoid this call by using the right
// test runner
}
並創建兩個類似的測試來檢查輸入“ I”和任何其他輸入(對於該問題應重復一次)的行為。
如果您使用BufferedReader.readLine()
而不是擔心字符,則promptStringOrFile()
方法可能會更清晰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.