JMock的希望您使用context.checking()
然後呼叫測試中的代碼,然後電話申報的期望context.assertIsSatisfied()
(雖然有時最後一步是使用適當的測試運行隱含如果做)。
在運行任何代碼之前,您似乎立即調用context.assertIsSatisfied()
。
此外,您發佈的代碼使用變量mn
,它似乎沒有定義 - 實際上是您正在運行的代碼?或者應該該變量爲mockIn
而不是?
更新:好的,問題可能是您試圖模擬靜態方法 - JMock不支持這一點 - 請參閱jmock mocking a static method。特別參見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()
方法可能更清晰。
來源
2012-04-21 20:06:16
DNA
如果您打算髮布鏈接的代碼,[SSCCE](http://sscce.org)可能會讓您的答案更快... – DNA 2012-04-21 20:13:07
您是對的,對不起,請在下面重新發布SSCCE。 – 2012-04-21 21:25:02
不幸的是,這不是自包含的(需要其他幾個類,比如'Word'和'WordFrequency'),也沒有正確的 - 'main'不會編譯,因爲它使用類型'bool'並調用未定義的方法'inputReadFailure' – DNA 2012-04-21 21:45:39