개요
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
두 메서드를 잘 이용하자