Я делаю некоторые модульные тесты, где по существу мне нужен входной поток, чтобы заблокировать навсегда.Прямо сейчас я использую это для создания входного потока
InputStream in = new ByteArrayInputStream("".getBytes());
Хотя это работает некоторое время, в других случаях входной поток читается до того, как выходной поток (то, что я тестирую) закончен,вызывая всевозможные разрушения.
По существу мне нужен этот поток ввода, чтобы заблокировать навсегда при чтении.Единственное решение, которое я могу придумать, - это настроить InputStream с массивным буфером, чтобы другие потоки заканчивали работу, но это действительно хакерское и хрупкое решение.У меня действительно есть mockito, но я очень новичок в этом и не уверен, смогу ли я уйти с помощью только насмешливого чтения, не высмеивая что-либо еще.
Кто-нибудь знает лучшее решение?
РЕДАКТИРОВАТЬ:
Это моя новая попытка.Он работает большую часть времени, но в других случаях входной поток умирает рано, что приводит к смерти выходного потока (такое поведение является преднамеренным).Хотя я не могу понять, почему иногда это не получается.
Это общий тест для TestNG, упрощенный для ясности.
protected CountDownLatch inputLatch;
@BeforeMethod
public void botSetup() throws Exception {
//Setup streams for bot
PipedOutputStream out = new PipedOutputStream();
//Create an input stream that we'll kill later
inputLatch = new CountDownLatch(1);
in = new AutoCloseInputStream(new ByteArrayInputStream("".getBytes()) {
@Override
public synchronized int read() {
try {
//Block until were killed
inputLatch.await();
} catch (InterruptedException ex) {
//Wrap in an RuntimeException so whatever was using this fails
throw new RuntimeException("Interrupted while waiting for input", ex);
}
//No more input
return -1;
}
});
Socket socket = mock(Socket.class);
when(socket.getInputStream()).thenReturn(in);
when(socket.getOutputStream()).thenReturn(out);
//Setup ability to read from bots output
botOut = new BufferedReader(new InputStreamReader(new PipedInputStream(out)));
...
}
@AfterMethod
public void cleanUp() {
inputLatch.countDown();
bot.dispose();
}
Для теста я использую readLine()
из botOut, чтобы получить соответствующее количество строк.Проблема заключается в том, что когда выходной поток умирает, readLine()
блокируется навсегда, что приводит к зависанию TestNG.Я пробовал тайм-аут со смешанными результатами: большую часть времени он работал бы, но в других он убивал бы тесты, для тестирования которых потребовалось немного больше времени, чем обычно.
Мой единственный другой вариант - просто не использовать потоки для такого рода работы.Выходной поток опирается на выходную очередь, так что я могу просто убежать от этого.Проблема в том, что я не проверяю запись в поток, просто то, что будет отправлено, что меня беспокоит.