3

キーボードからの入力を受け取るメイン メソッドを単体テストしようとしています。キーボード入力のテストとそのための使用について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 番目の入力は取得していません...

どんな助けでも大歓迎です。

4

1 に答える 1