我正在尝试对从键盘输入的主要方法进行单元测试。我知道有几个关于测试键盘输入和使用的问题System.setIn(...)
,但它只适用于我的第一个输入。
我的代码:
public class TestApp {
@Test
public void testMain() {
InputStream stdin = System.in;
try {
System.setIn(new ByteArrayInputStream("s\r\nx\r\n".getBytes()));
String args[] = {};
App.main(args);
// TODO: verify that the output is what I expected it to be
}
catch(IOException e) {
assertTrue("Unexpected exception thrown: " + e.getMessage(), false);
}
finally {
System.setIn(stdin);
}
}
}
我想要实现的是输入“s”,然后输入“x”(两个不同的条目)。
正常使用程序时,按's'后按回车键应输出内容,按'x'后应输出其他内容。主要方法如下所示:
class App {
public static void main(String[] args) throws IOException {
int choice;
do {
choice = getChar();
switch(choice) {
case 's':
System.out.println("Text for S");
break;
case 'x':
System.out.println("Exiting");
break;
}
} while(choice != 'x');
}
public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
public static char getChar() throws IOException {
String s = getString();
return s.charAt(0);
}
}
注意:我知道实现它的最佳方法是注入InputStream
依赖项并使用它而不是System.in
,但我无法更改代码。这是我有的限制,我不能改变main()
,getString()
或者getChar()
方法。
当我执行测试时,这是输出:
S 的文本
java.lang.NullPointerException
at App.getChar(tree.java:28)
at App.main(tree.java:7)
at TestApp.testMain(TestApp.java:15) <23 内部调用>
所以,看起来它获得了第一个输入('s'),但没有获得第二个输入......
非常感谢任何帮助。