JUnit使用Mockito测试用户输入

时间:2014-11-24 13:25:58

标签: java unit-testing junit mockito

我对Mocking Framework Mockito有疑问。我想测试用户在控制台中输入的输入。没有Mocking它工作得很好,但有了它我不知道如何从函数中获取返回值,它是控制台中的输入。

没有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写的数字。

提前致谢!

2 个答案:

答案 0 :(得分:3)

您需要模拟BufferedReader的{​​{1}} API来返回您的价值。 即

readLine()

现在,当您从Test调用readInput()时,将调用您的模拟缓冲读者的API。希望这可以回答您的问题。

答案 1 :(得分: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());
  }
}