我对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
上写的数字.
提前感谢!
你需要模拟BufferedReader
的readLine()
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());
}
}