我对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
写的数字。
提前致谢!
答案 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());
}
}