簡體   English   中英

JMock-如何模擬控制台輸出

[英]JMock - how to mock console output

這篇文章是類似於:

我有一個控制台應用程序,它既需要用戶輸入,又需要響應用戶輸出。 我正在為此編寫一些單元測試,以確保代碼正常工作。 我需要確保其輸出和輸入與我期望的一樣。

本質上,我有一個正在測試的主要方法要求輸入文件或輸入。 在我的測試中,我使用System.setOutSystem.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.

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