Ответ Стефана Биркнера дал мне направление, которое мне нужно для решения этой проблемы. Я опубликовал код, который я использовал для решения этой проблемы.
Solved tests: Birkner's version (recommended)
Solved tests: piped version
Changed source:
ПОЧЕМУ: Что происходит, с библиотекой Birkner, вы можете только когда-либо читал столько ввод как инстанцировании с правилом первоначально. Если вы хотите итеративно писать в конечную точку, вы можете сделать это с помощью взлома трубки, но это не имеет большого значения, вы не можете писать на вход по каналу, пока функция фактически запущена, поэтому вы может также использовать версию Биркнера, его @Rule более кратким.
Объяснение: В обоих хака трубы и с кодом Birkner, в самом клиенте тестируется, несколько вызовов, чтобы создать какой-либо объект, который считывает с System.in вызовет проблемы блокировки, где после того, как первый объект открыл подключение к трубе или к System.in, другие не могут. Я не знаю, почему это точно для кода Биркнера, но с Pipe я думаю, что это потому, что вы можете открыть только один поток для объекта. Обратите внимание, что если вы вызовете ближайший буферизированный считыватель и затем попытаетесь повторно открыть System.in в своем клиентском коде после его вызова из теста, то вторая попытка открыть не будет выполнена, потому что канал со стороны автора закрыт также.
Решение: Простой способ решить эту проблему и, вероятно, не лучший, поскольку требует изменения источника фактического проекта, но не ужасающим образом (пока). Поэтому вместо того, чтобы иметь в основе фактического проекта несколько созданий BufferedReader, создайте буферизованный читатель и передайте одну и ту же ссылку на читателя или сделайте ее частной переменной класса. Помните, что если вам нужно объявить статичным, что вы не должны инициализировать его в статическом контексте, потому что если вы это сделаете, то при запуске тестов System.setIn получит имя ПОСЛЕ того, как читатель был инициализирован вашим клиентом. Таким образом, он будет опросить все вызовы readLine/any, как и будет, если вы попытаетесь создать несколько объектов из System.in. Обратите внимание, что для чтения ваших разделов между вызовами вашего читателя, в данном случае BufferedReader, вы можете использовать символы новой строки для их разделения в исходной настройке. Таким образом, он возвращает то, что вы хотите в каждом вызове тестируемого клиента.
В чем именно заключается цель этого? У вас есть фактический модульный тест? Я не вижу смысла использовать JMock. – jmend
Да, у меня есть фактический модульный тест. Я хочу, чтобы мои модульные тесты запускались без меня, чтобы дать им фактический ввод в консоль. Я хочу, чтобы входные данные поступали от того, что я указывал в функции тестирования. –