अपने कोड को चलाने के लिए, आपको सिस्टम इनपुट / आउटपुट फ़ंक्शन के लिए एक आवरण बनाना चाहिए। आप यह निर्भरता इंजेक्शन का उपयोग करके कर सकते हैं, हमें एक वर्ग दे सकते हैं जो नए पूर्णांक के लिए पूछ सकते हैं:
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();
}
}
तब आप अपने कार्य के लिए परीक्षण बना सकते हैं, मॉक फ्रेमवर्क का उपयोग करके (मैं मॉकिटो का उपयोग करता हूं):
@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;
}
यह आपके छोटे से उदाहरण के लिए ओवरकिल की तरह लग सकता है, लेकिन यदि आप एक बड़ा एप्लिकेशन बना रहे हैं, तो यह इस तरह से विकसित हो सकता है कि आप जल्दी से भुगतान कर सकें।