キーボードからの入力を受け取るメイン メソッドを単体テストしようとしています。キーボード入力のテストとそのための使用についてSOにいくつかの質問があることは知っています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」(2 つの異なるエントリ) を入力することです。
プログラムを通常に使用する場合、'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') を取得しているように見えますが、2 番目の入力は取得していません...
どんな助けでも大歓迎です。