Держать поддельные входные данные открытыми - PullRequest
0 голосов
/ 24 января 2020

Чтобы протестировать реализацию протокола, я хочу смоделировать 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. Только после этого он начнет правильно использовать сообщения.

...