Search

JUnit5 - 표준 입출력 테스트

Tags
java
test
Created
2024/04/21 20:28
Created time
2024/04/21 11:28
category
java

개요

Scanner의 메서드를 이용한 입력
System.out의 메서드를 이용한 출력
두 케이스를 테스트 하기 위한 방법을 탐색

입력

Scanner sc = new Scanner(System.in);
Java
복사
입력은 위와 같이 표준 입력 스트림인 System.in을 이용
System.in을 살펴보면 null 값으로 기재되어 있고, 이미 열려 있는 스트림인 것을 알 수 있음
또한 키보드 입력뿐만 아니라 다른 입력 소스를 설정하는 것도 가능
System::setIn 메서드를 이용하면 System.in에 적용되는 스트림을 표준 입력이 아니라 사용자가 직접 설정한 스트림을 이용할 수 있음
따라서 키보드로 입력 받는 값 대신 사전에 정의한 문자열을 입력 스트림으로 System::setIn에 설정하면, 해당 값을 이용하여 테스트 가능
package org.example; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import java.io.ByteArrayInputStream; import java.util.Scanner; import static org.assertj.core.api.Assertions.assertThat; class MainTest { @ParameterizedTest @CsvSource(value = {"Hello", "Hi", "안녕", "bonjour"}) void test(String input) { setIn(input); Scanner sc = new Scanner(System.in); assertThat(sc.nextLine()).isEqualTo(input); } void setIn(String input) { System.setIn(new ByteArrayInputStream(input.getBytes())); } }
Java
복사

출력

System::setIn의 경우 InputStream을 받을 때 테스트 케이스마다 입력 값이 필요하기 때문에, 매 테스트마다 호출이 필요
하지만 출력의 경우 출력 받는 OutputStream만 지정한다면, 대상에서 바로 값을 읽을 수 있기 때문에 @BeforeEach를 사용할 수 있고 훨씬 깔끔하게 작성 가능
System.out.println("");
Java
복사
출력 구문은 대체로 위와 같이 작성할 수 있는데, 표준 출력 스트림인 System.out을 사용
System.out 역시 null로 설정 되어 있고, 이미 열려 있는 스트림임을 알 수 있음
입력과 마찬가지로 사용자가 지정한 출력 스트림을 지정 가능
System::setOut 메서드를 이용하면 System.out에 적용되는 스트림을 표준 출력이 아니라 사용자가 직접 설정한 스트림을 이용할 수 있음
따라서 콘솔 창에 출력되는 대신 사전에 정의한 출력 스트림으로 값을 추출하여 테스트 가능
package org.example; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.io.PrintStream; import java.util.Scanner; import static org.assertj.core.api.Assertions.assertThat; class MainTest { private OutputStream os; @BeforeEach void setOut() { os = new ByteArrayOutputStream(); System.setOut(new PrintStream(os)); } @ParameterizedTest @CsvSource(value = {"Hello", "Hi", "안녕", "bonjour"}) void test(String input) { setIn(input); Scanner sc = new Scanner(System.in); System.out.println(sc.nextLine()); assertThat(os.toString()).isEqualTo(input + System.lineSeparator()); } void setIn(String input) { System.setIn(new ByteArrayInputStream(input.getBytes())); } }
Java
복사

결론

System.in → System::setIn
System.out → System::setOut
두 메서드를 잘 이용하자