2012-04-21 24 views
0

這篇文章是類似於:thisJMock的 - 如何嘲笑控制檯輸出

我有兩個希望用戶輸入和具有響應用戶輸出一個控制檯應用程序。我正在編寫一些單元測試以確保代碼正常工作。我需要能夠確保輸出和輸入是我所期望的。

本質上,我有一個主要方法正在測試,要求文件或輸入。在我的測試中,我使用System.setOutSystem.setIn分別將它們設置爲PrintStream和InputStream對象的context.mock版本。我不關心什麼System.out.println調用,直到我必須測試程序數據的實際處理時,它將結果輸出到控制檯。因此,要總結:

這裏的被測試我的源代碼(一些接近,我修剪多出):http://ideone.com/rptC0

下面是我在我的嘲弄程序:http://ideone.com/VkvqM

而這裏的,我是例外得到:ideone.com/OEOS8

正如你可以清楚地看到我的期望,我明確地說,我打算打印出完全相同的字符串,我在我的期望中指定了。但是這個例外說這是意想不到的。我不明白...

+0

如果您打算髮布鏈接的代碼,[SSCCE](http://sscce.org)可能會讓您的答案更快... – DNA 2012-04-21 20:13:07

+0

您是對的,對不起,請在下面重新發布SSCCE。 – 2012-04-21 21:25:02

+0

不幸的是,這不是自包含的(需要其他幾個類,比如'Word'和'WordFrequency'),也沒有正確的 - 'main'不會編譯,因爲它使用類型'bool'並調用未定義的方法'inputReadFailure' – DNA 2012-04-21 21:45:39

回答

0

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()方法可能更清晰。

+0

以及我重新安排它,它仍然沒有工作,而使用mn變量。 mn變量是我試圖測試的類主模擬版本。 這裏的[code](http://ideone.com/rptC0) 這裏是[測試](http://ideone.com/VkvqM) – 2012-04-21 21:31:33

+0

啊,問題是,你試圖嘲笑一個靜態方法。 JMock不支持這一點。看到http://stackoverflow.com/questions/218813/jmock-mocking-a-static-method – DNA 2012-04-21 21:53:59

+0

其實,我編輯它,並得到了一點點......現在我遇到了參數上的參數麻煩讀函數接受一個數組。我不知道該怎麼做。 [Code](http://ideone.com/pPwCf),[tests](http://ideone.com/MwvzN) [Stack trace]( http://pastebin.com/WRMPT3Aj) – 2012-04-21 22:31:09