Javaコンソールウィンドウ出力のテスト


結果値を確認する方法では、直接出力値を見つけて出力値をテストする方法があります.

stream


配列または集合内のデータを管理するStreamオブジェクトではありません.ここstreamは데이터를 운반하는 데 사용되는 연결 통로です.I/Oとは、コンピュータ内部または外部機器とプログラムとの間でデータを交換することを意味する.streamは一方向通信のみをサポートするため、Javaは入力をサポートするInputStreamと出力をサポートするOutputStreamとしてオブジェクトを分離・管理する.

バイトベースのストリーム-InputStreamとOutputStream


ストリームはバイト単位でデータを転送します.InputStreamおよびOutputStreamは、I/Oの機能に関する抽象メソッドとして定義される抽象クラスである.それぞれのI/Oターゲットに応じて、継承されたクラスを使用すればよい.バイトベースのストリームのほか、アシストストリーム、文字ベースのストリームなどがある.
入力ストリーム出力ストリームI/Oターゲットタイプオーディオデバイス
コンソールウィンドウから出力された値を表示したいため、ByteArrayOutputStreamクラスを使用しました.

System .setOut


デフォルトでは、出力する値をOutputStreamオブジェクトのシステムに保存します.outの値は、私が使用したいタイプのオブジェクト(ByteArrayOutputStream)に変更されます.
private static ByteArrayOutputStream outputMessage = new ByteArrayOutputStream();
System.setOut(new PrintStream(outputMessage));
システムのoutはPrintStreamタイプであるため、PrintStreamオブジェクトは生成された値として指定される.
テストが完了したら、通常のコンソールウィンドウの出力のために、再び戻る必要があります.
System.setOut(System.out);

サンプルコード


優雅な技術路線で行われているチェスタスクには、点数が正しいことを確認するテストコードが出力されている.
package chess.domain.board;

import static org.junit.jupiter.api.Assertions.*;

class StatusTest {

    private static ByteArrayOutputStream outputMessage;

    @BeforeEach
    void setUpStreams() {
        outputMessage = new ByteArrayOutputStream(); // OutputStream 생성
        System.setOut(new PrintStream(outputMessage)); // 생성한 OutputStream 으로 설정
    }

    @AfterEach
    void restoresStreams() {
        System.setOut(System.out); // 원상복귀
    }

    @Test
    @DisplayName("게임 점수 계산")
    void showStatus() {
        Map<Position, Piece> pieces = new HashMap<>();
        pieces.put(Position.from("a1"), new Queen(Color.WHITE));
        pieces.put(Position.from("a2"), new Rook(Color.BLACK));

        Board board = new Board(() -> pieces);

        Status status = new Status(board);
        status.show(Output::printScore);
        assertEquals("검은색의 점수는 5.0점 입니다.\n흰색의 점수는 9.0점 입니다.\n", outputMessage.toString()); // 버퍼에 저장된 값을 가져와 비교한다
    }

    @Test
    @DisplayName("폰이 같은 x 에 존재할 경우의 게임 점수 계산")
    void showStatusPawnScore0_5() {
        Map<Position, Piece> pieces = new HashMap<>();
        pieces.put(Position.from("a1"), new Pawn(Color.WHITE));
        pieces.put(Position.from("a2"), new Pawn(Color.WHITE));
        pieces.put(Position.from("a3"), new Pawn(Color.BLACK));

        Board board = new Board(() -> pieces);

        Status status = new Status(board);
        status.show(Output::printScore);
        assertEquals("검은색의 점수는 1.0점 입니다.\n흰색의 점수는 1.0점 입니다.\n", outputMessage.toString()); // 버퍼에 저장된 값을 가져와 비교한다
    }
}
ByteArrayOutputStreamのtoString()を使用して、バッファに格納されているバイト値をStringに返します.返された値が予想された値と一致するかどうかを確認します.

リファレンス

  • JDK 11 - OutputStream
  • JDK 11 - ByteArrayOutputStream
  • Javaのクラシック-Chapter 15 I/O