모눈종이에 사각사각
System.out.println() 단위 테스트하기 본문
단위 테스트를 하는 방법을 조금씩 공부를 하고 있던 중,
반환값이 없는, 즉 프린트한 결과값을 통해서는 테스트를 어떻게 하는지 궁금하여 찾아보았다.
내가 하려고 한 테스트는 게임의 상태를 출력하는 것이다.
게임 상태 클래스는 다음과 같다.
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()으로 앞뒤공백을 제거해준 후 검사한다.
성공!
📚 참고사이트
'활동기록' 카테고리의 다른 글
[프리코스] 3주차 회고 (0) | 2022.11.17 |
---|---|
[프리코스] 2주차 회고 (0) | 2022.11.09 |
[우테코 프리코스 2주차] Assertions 분석 (0) | 2022.11.04 |
[우테코 프리코스 2주차] NsTest 분석 (0) | 2022.11.03 |
[프리코스] 1주차 회고 (0) | 2022.11.03 |
Comments