2014-11-24 89 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()); 
    } 
}