JUnit 使用 Mockito 测试用户输入



我对Mocking Framework 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上写的数字.

提前感谢!

你需要模拟BufferedReaderreadLine() API来返回你的值。即

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

现在,当您从测试中调用 readInput() 时,将调用模拟缓冲读取器的 API。希望这能回答你的问题。

您可以使用系统规则库的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());
  }
}

相关内容

  • 没有找到相关文章

最新更新