JUnit: How to simulate System.in testing?
command-line, java, junit
Solution
It is technically possible to switch `System.in`, but in general, it would be more robust not to call it directly in your code, but add a layer of indirection so the input source is controlled from one point in your application. Exactly how you do that is an implementation detail - the suggestions of dependency injection are fine, but you don't necessarily need to introduce 3rd party frameworks; you could pass round an I/O context from the calling code, for example.
How to switch `System.in`:
String data = "Hello, World!\r\n";
InputStream stdin = System.in;
try {
System.setIn(new ByteArrayInputStream(data.getBytes()));
Scanner scanner = new Scanner(System.in);
System.out.println(scanner.nextLine());
} finally {
System.setIn(stdin);
}
Problem
I have a Java command-line program. I would like to create JUnit test case to be able to simulate `System.in`. Because when my program runs it will get into the while loop and waits for input from users. How do I simulate that in JUnit? Thanks