Чтобы протестировать реализацию протокола, я хочу смоделировать inputStreams из System.in и socket.getInputStream ().
Код, с которым я пытаюсь добиться этого, выглядит следующим образом:
String userInputSequence = "foo\n";
// Redirect System.in
System.setIn(new ByteArrayInputStream(userInputSequence.getBytes()));
String serverInputSequence = "bar\n";
InputStream serverInputStream = new ByteArrayInputStream(serverInputSequence.getBytes());
Socket sock = mock(Socket.class);
// Redirect streams
when(sock.getOutputStream()).thenReturn(System.out);
when(sock.getInputStream()).thenReturn(serverInputStream);
SomeClass foo = new SomeClass(sock);
Thread fooThread = new Thread(foo);
Thread fooThread = new Thread(() -> foo.someFunc());
// At this point, I would like to assert information from foo,
// after which I want to add information to the stream again.
Код, который читает с serverInputStream, использует типичный BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream))
в сочетании с in.readLine()
.
Как и ожидалось, он читает с serverInputStream, но вместо того, чтобы ждать большего ввода, когда он достигает конца inputStream, in.readline()
возвращает null
, потому что достигнут конец потока.
Как я могу оставить inputStream открытым в среде тестирования, в которой in.readline () блокируется до тех пор, пока inputStream не получит больше данные по основному потоку?
PS. Я не думаю, что могу использовать Mocking Java InputStream , потому что мой класс постоянно захватывает сообщения из потока, пока не будет введен вход system.in. Только после этого он начнет правильно использовать сообщения.