2

私は、学生の宿題がうまくいくかどうかを評価するためのテストプログラムを書くことを任されています。生徒たちは、Javaでじゃんけんゲームを作成し、コマンドラインでユーザーに入力を求めることで、nラウンドのゲームをプレイする単一のクラスを作成しています。これらの生徒は全員、1つ以上のScannerオブジェクトを使用してコンソールから入力を読み取ります。そのため、テストプログラムで事前に定義された入力をシミュレートし、期待される出力を確認する必要があります。System.inをオーバーライドするので、学生がを呼び出すとScanner myReader = new Scanner(System.in);、入力が何であるかを指示することができます(ByteArrayInputStreamを使用)。私がどのように始めたかを知るために:

public class TestRockPaperScissors extends RockPaperScissors{
public static void main(String[] args){
    InputStream stdin = System.in;
    try {
    System.setIn(new ByteArrayInputStream("<test inputs here>".getBytes()));
    RockPaperScissors.main(null); // This will be student code in another file.
    } finally {
        System.setIn(stdin);
    }

}

問題は、これは、学生がSystem.inを使用して単一のスキャナーのみを作成する場合にのみ機能することです。そうしないと、2番目のスキャナーが.next()を使用するための入力がないため、エラーが発生します。

TL; DR ... RockPaperScissors.main(null)呼び出しのソースが表示されない場合、任意の数のスキャナーのコンソール入力をシミュレートするにはどうすればよいですか?

4

2 に答える 2

1

InputStreamから値を取得し、結果をPrintStreamに書き込むことによって、RockPaperScissorsを実行するオブジェクトを作成するように生徒に依頼します。つまり、次のインターフェイスの実装を作成します。

public interface RockPaperScissors {
    void runGame(InputStream in, PrintStream out) throws IOException;
}

これにより、System.inとSystem.outを引数として使用して、クラスのインスタンスを使用して独自のプログラムをテストできるようになります。

これにより、入力のシーケンスを含む独自のByteArrayInputStreamと、プログラムによって生成された出力を含む独自のByteArrayOutputStreamを渡すことで、プログラムの単体テストを行うことができます。これも検証できます。

ところで、学生は自分のコードを単体テストすることを学ぶべきではありませんか?

于 2013-02-17T08:52:45.480 に答える
1

システムルールライブラリのルールStandardOutputStreamLogTextFromStandardInputStreamルールを使用して、コマンドラインインターフェイスのより明確なテストを作成できます。

public class RockPaperScissorsTest() {
  @Rule
  public StandardOutputStreamLog log = new StandardOutputStreamLog();

  @Rule
  public TextFromStandardInputStream systemInMock = emptyStandardInputStream();

  @Test
  public void test1() {
    systemInMock.provideText("<test input>");
    RockPaperScissors.main(null);
    assertTrue(log.getLog().contains("<expected output>"));
  }

  @Test
  public void test2() {
    systemInMock.provideText("<another test input>");
    RockPaperScissors.main(null);
    assertTrue(log.getLog().contains("<expected output>"));
  }
}
于 2013-02-17T16:40:26.900 に答える