1. ホーム
  2. java

[解決済み] ユーザー入力をシミュレートしたJUnitテスト

2023-04-29 08:33:12

質問

私はユーザー入力を必要とするメソッドのためにいくつかのJUnitテストを作成しようとしています。テスト対象のメソッドは、次のメソッドのように多少見えます。

public static int testUserInput() {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Give a number between 1 and 10");
    int input = keyboard.nextInt();

    while (input < 1 || input > 10) {
        System.out.println("Wrong number, try again.");
        input = keyboard.nextInt();
    }

    return input;
}

JUnitのテストメソッドで私や他の人が手動で行う代わりに、自動的にプログラムにintを渡す方法はありますか?ユーザー入力をシミュレートするような?

事前にありがとうございます。

どのように解決するのですか?

以下のように を独自のストリームで置き換えることができます。 . InputStreamはバイト配列でもかまいません。

InputStream sysInBackup = System.in; // backup System.in to restore it later
ByteArrayInputStream in = new ByteArrayInputStream("My string".getBytes());
System.setIn(in);

// do your thing

// optionally, reset System.in to its original
System.setIn(sysInBackup);

別のアプローチとして、INとOUTをパラメータとして渡すことで、このメソッドをよりテストしやすくすることができます。

public static int testUserInput(InputStream in,PrintStream out) {
    Scanner keyboard = new Scanner(in);
    out.println("Give a number between 1 and 10");
    int input = keyboard.nextInt();

    while (input < 1 || input > 10) {
        out.println("Wrong number, try again.");
        input = keyboard.nextInt();
    }

    return input;
}