Здесь много чего можно сказать.
Прежде всего, чтобы ответить на ваш вопрос. Когда метод не возвращает что-то, вы все равно можете проверить, обновляется ли некоторое «другое состояние» соответственно.
В вашем случае одним значимым наблюдением может быть этот призыв
processLine(strLine);
Другими словами: вы могли видеть, что делает этот метод, и каким-то образом проверять, был ли вызван другой метод, как и следовало ожидать.
Тогда: вы действительно написали сложный для тестирования код. Одна из причин этого заключается в том, что этот метод начинает свою работу с строки (которая указывает на файл). Вместо этого вы можете уже передать объект reader этому методу. Тогда не было бы необходимости использовать PowerMock, например. Вы просто подготавливаете объект для чтения, имеющий известное содержимое, и затем вы можете проверить, что последующие действия соответствуют этому подготовленному содержимому!
Кроме того, вы должны узнать о попытке с ресурсами, а также узнать больше о том, как выполнять ввод-вывод. Нет смысла закрывать все 3 потока. Когда вы создаете ридер в каком-то другом потоке и закрываете внешний ридер, этот «базовый» поток автоматически закрывается по пути.