728x90
헤드퍼스트 디자인 패턴을 통해 템플릿 메소드 속 후크 알아보고 활용하기를 구현해보고
단위 테스트를 하고자하는데 사용자 입력을 받아야 하는 메소드가 있었다
private String getUserInput() {
String answer = null;
System.out.print("커피에 우유와 설탕을 넣을까요? (y/n) ");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
answer = in.readLine();
} catch (IOException ioe) {
System.err.println("IO 오류");
}
return answer == null ? "n" : answer;
}
해당 method에는 매개변수가 없기 때문에 테스트코드에서 해결해줘야 한다
아래와 같은 방식으로 해결할 수 있다
@DisplayName("우유와 설탕 추가")
@Test
void GivenY_whenCustomerCoffeePrepareRecipe() {
// Given
InputStream input = System.in;
ByteArrayInputStream in = new ByteArrayInputStream("y".getBytes());
System.setIn(in);
// When & Then
coffeeWithHook.prepareRecipe();
}
@DisplayName("우유와 설탕 추가 안함")
@Test
void GivenN_whenCoffeePrepareRecipe() {
// Given
InputStream input = System.in;
ByteArrayInputStream in = new ByteArrayInputStream("n".getBytes());
System.setIn(in);
// When & Then
coffeeWithHook.prepareRecipe();
}
가능한 이유는 System.setIn이 표준 입력 스트림을 재할당 할 수 있다
즉 System.setIn을 호출하여 System.in으로 자신의 스트림으로 바꿀 수 있기 때문에
테스트 코드 단에서 사용자 입력에 따라 결과를 확인해볼 수 있다
사용자 입력 값이 y일 땐 커피 우유와 설탕을 추가할 수 있고
사용자 입력 값이 n일 땐 커피 우유와 설탕을 추가할 수 없다
그러면 경우에 따라 테스트 코드 결과를 확인해보고 마무리!
[참고]
https://stackoverflow.com/questions/6415728/junit-testing-with-simulated-user-input
https://docs.oracle.com/javase/6/docs/api/java/lang/System.html#setIn%28java.io.InputStream%29
'IT > 기록' 카테고리의 다른 글
21년 12월 JAVA 보안 취약점 이슈와 API 보안에 대해 학습 (0) | 2022.08.04 |
---|---|
gradle project에서 JMH 라이브러리를 이용해 java code 성능 측정 (0) | 2022.08.03 |
Spring Boot DevTools 사용 (0) | 2022.07.04 |
[Error] Set the spring.mongodb.embedded.version property or define your own MongodConfig bean to use embedded MongoDB (0) | 2022.06.29 |
Flutter I/O Extended Korea 2022에 다녀오다! (0) | 2022.06.28 |