코드를 테스트하려면 시스템 입력 / 출력 함수에 대한 래퍼를 만들어야합니다. 종속성 주입을 사용하여이를 수행 할 수 있으며 새 정수를 요청할 수있는 클래스를 제공합니다.
public static class IntegerAsker {
private final Scanner scanner;
private final PrintStream out;
public IntegerAsker(InputStream in, PrintStream out) {
scanner = new Scanner(in);
this.out = out;
}
public int ask(String message) {
out.println(message);
return scanner.nextInt();
}
}
그런 다음 모의 프레임 워크 (Mockito 사용)를 사용하여 함수에 대한 테스트를 만들 수 있습니다.
@Test
public void getsIntegerWhenWithinBoundsOfOneToTen() throws Exception {
IntegerAsker asker = mock(IntegerAsker.class);
when(asker.ask(anyString())).thenReturn(3);
assertEquals(getBoundIntegerFromUser(asker), 3);
}
@Test
public void asksForNewIntegerWhenOutsideBoundsOfOneToTen() throws Exception {
IntegerAsker asker = mock(IntegerAsker.class);
when(asker.ask("Give a number between 1 and 10")).thenReturn(99);
when(asker.ask("Wrong number, try again.")).thenReturn(3);
getBoundIntegerFromUser(asker);
verify(asker).ask("Wrong number, try again.");
}
그런 다음 테스트를 통과하는 함수를 작성하십시오. 요청 / 받기 정수 중복을 제거 할 수 있고 실제 시스템 호출이 캡슐화되기 때문에 함수가 훨씬 더 깔끔합니다.
public static void main(String[] args) {
getBoundIntegerFromUser(new IntegerAsker(System.in, System.out));
}
public static int getBoundIntegerFromUser(IntegerAsker asker) {
int input = asker.ask("Give a number between 1 and 10");
while (input < 1 || input > 10)
input = asker.ask("Wrong number, try again.");
return input;
}
이것은 당신의 작은 예제에 대해 과잉처럼 보일 수 있지만, 이와 같이 개발하는 더 큰 애플리케이션을 구축하는 경우 다소 빨리 결과를 얻을 수 있습니다.