За да тествате кода си, трябва да създадете обвивка за системни функции за вход/изход. Можете да направите това с помощта на инжектиране на зависимости, давайки ни клас, който може да поиска нови цели числа:
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;
}
Това може да изглежда пресилено за вашия малък пример, но ако изграждате по-голямо приложение, разработването по този начин може да се изплати доста бързо.
person
Garrett Hall
schedule
20.06.2011