JUnit завершает дочерние потоки

Когда я тестирую осуществление метода, который создает дочерний поток, тестовые концы JUnit перед дочерним потоком и уничтожает его.

Как я вынуждаю JUnit ожидать дочернего потока для завершения его выполнения?

Спасибо

17
задан Mark 14 May 2010 в 19:10
поделиться

3 ответа

После прочтения вопроса и некоторых комментариев кажется, что вам нужна методика модульного тестирования асинхронных операций . doSomething () немедленно возвращается, но вы хотите, чтобы тестовый код дождался своего завершения, а затем выполнил некоторые проверки.

Проблема в том, что тест не знает о потоках, порождаемых вызовом, поэтому, очевидно, у него нет средств их ожидания. Можно придумать множество сложных (и, вероятно, ошибочных) способов решить эту проблему, но, на мой взгляд, здесь есть проблема дизайна. Модульный тест должен имитировать клиента некоторого API, и он не должен ничего предполагать о реализации; Он должен только тестировать функциональность, как это отражено в API и его документации. Поэтому я бы не пытался обнаруживать и отслеживать потоки, созданные асинхронным вызовом. Вместо этого я бы при необходимости улучшил API тестируемого класса. Класс, к которому принадлежит асинхронный вызов, должен предоставлять некоторый механизм для обнаружения завершения. Я могу придумать 3 способа, но их, вероятно, больше:

1) Разрешить регистрацию слушателя, который получает уведомление после завершения операции

2) Обеспечение синхронной версии операции. Реализация может вызвать асинхронную версию, а затем заблокировать ее до завершения. Если класс не должен предоставлять такой метод, его видимость может быть уменьшена до защищенного пакета, чтобы тест мог получить к нему доступ.

3) Использование шаблона ожидания-уведомления для некоторого видимого объекта.

Если класс не предоставляет такого механизма, то он не поддается тестированию, и, что еще хуже, его, вероятно, не очень много для повторного использования.

8
ответ дан 30 November 2019 в 14:32
поделиться

Попробуйте использовать thread.join() на созданном потоке. Это позволит дождаться смерти этого потока.

Edit: чтобы избежать этого, попробуйте Thread.getThreadGroup().setDaemon(true); в тесте, или, возможно, в методе setUp(). Однако я не тестировал это.

Группа потоков демона автоматически уничтожается, когда останавливается его последний поток или уничтожается его последняя группа потоков.

Интересно, вызывает ли JUnit System.exit() или что-то еще, как только тест завершается?

2
ответ дан 30 November 2019 в 14:32
поделиться

Возможно, сгруппируйте ваши потоки с помощью ExecutorService , затем используйте shutdown и метод awaitTermination ?

Условием является использование Runnable или Future, а не самих потоков.

0
ответ дан 30 November 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: