Ответ Чарли прибивает вашу актуальную проблему (как всегда делают его ответы). Однако я настоятельно рекомендую не проводить тесты, которые зависят от задержек. Если ваш тест не пройден, как вы узнаете, была ли проблема в том, что вы просто не ждали достаточно долго.
Кроме того, если это часть автоматизированного набора тестов, затрачиваемое время на выполнение всех тестов станет чрезвычайно дорогим, если вы добавите больше таких тестов.
Хорошие тесты являются детерминированными. Например, см. Мартина Фаулера «Искоренение недетерминизма в тестах» , в котором есть фраза:
Никогда не используйте бодрствующий сон для ожидания асинхронных ответов: используйте обратный вызов или опрос.
Мое предложение состояло бы в том, чтобы реорганизовать ваш код, чтобы функциональность была отделена от потоков, и протестировать функциональность, а не часть потоков.
Как только это разделение будет достигнуто, коду, который вызывает функциональность потока, можно присвоить Mock, и вы можете просто проверить, что Mock был вызван, поскольку вы отдельно проверили, что он ведет себя правильно, хотя для этого все еще требуется опрос ... так:
Если вы инкапсулируете код, который запускает отдельный поток, то в своем тесте предоставьте средство запуска для имитации потока, которое фактически выполняет код синхронно. Поэтому, как только тестируемый код завершен, вы можете сделать утверждение, не дожидаясь.