Để kiểm tra mã của bạn, bạn nên tạo một trình bao bọc cho các chức năng nhập / xuất hệ thống. Bạn có thể thực hiện việc này bằng cách sử dụng phương pháp tiêm phụ thuộc, cung cấp cho chúng tôi một lớp có thể yêu cầu các số nguyên mới:
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();
}
}
Sau đó, bạn có thể tạo các bài kiểm tra cho chức năng của mình, bằng cách sử dụng một khuôn khổ giả (tôi sử dụng 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.");
}
Sau đó, viết hàm của bạn vượt qua các bài kiểm tra. Hàm này gọn gàng hơn nhiều vì bạn có thể loại bỏ sự trùng lặp yêu cầu / nhận số nguyên và các lệnh gọi hệ thống thực tế được đóng gói.
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;
}
Điều này có vẻ như quá mức cần thiết đối với ví dụ nhỏ của bạn, nhưng nếu bạn đang xây dựng một ứng dụng lớn hơn đang phát triển như thế này thì có thể thu được lợi nhuận khá nhanh.