Как проверить, закрыт ли поток Java 8?

#unit-testing #java-8 #stream

#модульное тестирование #java-8 #поток

Вопрос:

У меня есть поток java 8 с базовым IOStream, и я хочу убедиться, что мой метод закрывает этот поток.

Есть ли какой-либо способ проверить это с помощью модульного теста?

Комментарии:

1. Не могли бы вы показать код?

Ответ №1:

Я думаю, что предоставление обработчика для onClose метода Stream — это самый простой способ сделать это.

 AtomicBoolean wasClosed = new AtomicBoolean(false);
Stream<> stream = Stream.of(foo, bar).onClose(() -> wasClosed.set(true));

// ...code under test that uses the stream

assertThat(wasClosed.get()).isTrue();
  

Как бы то ни было, мне законно нужно было это протестировать, поскольку мы создаем потоки из наборов результатов JDBC, и фактический поток полагается на OnClose для закрытия набора результатов.

Ответ №2:

Потоки имеют метод BaseStream.close() и реализуют автоматическое закрытие, но почти все экземпляры stream фактически не нужно закрывать после использования. Как правило, только потоки, источником которых является канал ввода-вывода (например, те, которые возвращаются Files.lines(путь, кодировка)), потребуют закрытия. Большинство потоков поддерживаются коллекциями, массивами или генерирующими функциями, которые не требуют специального управления ресурсами. (Если поток действительно требует закрытия, его можно объявить как ресурс в инструкции try-with-resources.)

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html