2014-11-24 92 views
0

我有一個Mocking Framework Mockito的問題。我想測試用戶在控制檯中輸入的輸入。沒有嘲笑它工作得很好,但它與我不知道如何從函數得到的輸入在控制檯中的返回值。JUnit用Mockito測試用戶輸入

沒有的Mockito:

讀取輸入法

public int readUserInput() { 
    BufferedReader console = new BufferedReader(new InputStreamReader(
      System.in)); 
    return Integer.parseInt(console.readLine()); 
    ... 
} 

測試方法:

public class TestClass { 
    Controller contr = new Controller(); 
    @Test 
    public void testUserInput() { 
     System.setIn(new ByteArrayInputStream("1".getBytes())); 
     assertEquals(1, contr.readUserInput()); 
     System.setIn(System.in); 
    } 
} 

但現在如何編寫一個帶了的Mockito測試。我嘗試了幾種方法,但都沒有工作。我得到的所有時間都是0而不是我在ByteArrayInputStream中寫的數字。

在此先感謝!

回答

3

您需要模擬BufferedReaderreadLine() API才能返回您的值。 即

Mockito.when(mockedBufferedReader.readLine()) 
       .thenReturn("1"); 

現在,當你調用readInput()從測試那麼你的嘲笑緩衝讀者的API將是invoked.Hope回答你的問題。

+0

謝謝,但你可以請給我更多的代碼來了解你做這件事的方式。 – mbauer 2014-11-24 13:42:29

+0

你在做@Mock BufferedReader mockedBufferedReader; //這會模擬你的BufferedReader,並在你的測試用例中使用上面的代碼模擬API。 – ppuskar 2014-11-24 13:45:43

+1

或使用本教程刷新Mockito知識:http://www.vogella.com/tutorials/Mockito/article.html – ppuskar 2014-11-24 13:47:49

0

您可以使用System Rules庫的TextFromStandardInputStream規則而不是Mockito。它確保System.in總是在測試後重置。 (您的代碼不會在一個失敗斷言的情況下重置System.in。)

public class TestClass { 
    @Rule 
    public TextFromStandardInputStream systemInMock = emptyStandardInputStream(); 

    Controller contr = new Controller(); 

    @Test 
    public void testSomething() { 
    systemInMock.provideText("1"); 
    assertEquals(1, contr.readUserInput()); 
    } 
}