모눈종이에 사각사각

System.out.println() 단위 테스트하기 본문

활동기록

System.out.println() 단위 테스트하기

모눈종이씨 2022. 11. 5. 14:16

단위 테스트를 하는 방법을 조금씩 공부를 하고 있던 중, 

반환값이 없는, 즉 프린트한 결과값을 통해서는 테스트를 어떻게 하는지 궁금하여 찾아보았다.

 

내가 하려고 한 테스트는 게임의 상태를 출력하는 것이다.

 

게임 상태 클래스는 다음과 같다.

public class GameState {
    private int strike;
    private int ball;

    public GameState() {
        this.strike = INITIAL_NUMBER;
        this.ball = INITIAL_NUMBER;
    }

    public void addStrike() {
        ++strike;
    }
    public void addBall() {
        ++ball;
    }

    public int getStrike() { return strike; }
    public int getBall() { return ball; }

    public void printGameState() {
        if (this.strike==ZERO && this.ball==ZERO) {
            System.out.println(NOTHING);
            return;
        }
        if (this.ball==ZERO) {
            System.out.println(this.strike+STRIKE);
            return;
        }
        if (this.strike==ZERO) {
            System.out.println(this.ball+BALL);
            return;
        }
        System.out.println(this.ball+BALL+" "+this.strike+STRIKE);
    }
}

 

내가 의도한 출력예시는

1스트라이크, 2볼, 1볼 2스트라이크, 낫싱 등이 있다.

 

스트라이크나 볼, 둘 다 0일 때는 "낫싱"을

스트라이크나 볼, 둘 중 하나가 0일 때는 "[숫자]스트라이크" or "[숫자]볼"

스트라이크와 볼, 둘 다 값이 있을 때는 "[숫자]볼 [숫자]스트라이크" 가 출력되길 원했다.

 

class GameStateTest {
    static ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream();

    @BeforeEach
    void setUp() {
        System.setOut(new PrintStream(outputStreamCaptor));
    }
    
    // ... 코드 생략
}

 

 

ByteArrayOuputStream은 바이트배열에 데이터를 입출력하는데 사용되는 스트림이다.

PrintStream은 지정된 출력스트림을 기반으로 하는 PrintStream인스턴스를 생성한다.

 

위의 코드에서는 ByteArrayOutputStream을 기반으로 하는 PrintStream 인스턴스가 생성되었고,

이를 System.setOut을 통해 콘솔이 아닌 ByteArrayOutputStream에 저장되게 한 것이다.

 

System.setOut에 대한 자세한 설명은 다음 글에서 참고하면 좋을 것 같다.

 

    @Test
    void 투볼() {
        GameState gameState = new GameState();
        gameState.addBall();
        gameState.addBall();

        gameState.printGameState();
        String answer = "2볼";

        assertThat(outputStreamCaptor.toString().trim()).isEqualTo(answer);
    }

 

그리고 로직을 실행한 후 나온 결과를 toString()으로 문자열로 바꾸고, trim()으로 앞뒤공백을 제거해준 후 검사한다.

성공!


📚 참고사이트

https://www.baeldung.com/java-testing-system-out-println

https://epicdevs.com/8

Comments