Тестирование асинхронного кода с помощью JUnit

Я хочу протестировать код, который полагается на передачу по сети. Код делает запрос и предоставляет обратный вызов - когда запрос завершается, обратный вызов запускается. Я хотел бы смоделировать сетевую передачу и использовать Thread.sleep для имитации некоторой задержки ... но, конечно, это заставит весь тест приостановиться.

До сих пор я создавал новые потоки и использовал CountDownLatch es на протяжении всего теста, чтобы остановить завершение теста до того, как будет запущен обратный вызов. Мой имитационный сетевой объект создает новый поток, засыпает в этом потоке, а затем запускает обратный вызов.На самом деле это работает очень хорошо, но проблема в том, что любые ошибки утверждения в обратном вызове не сообщаются исходному потоку junit - вместо этого я получаю текст исключения на консоли, где его гораздо труднее понять и использовать.

Я надеюсь, что есть либо:

  1. Способ передачи assertEquals вывода порожденных потоков в основной сборщик вывода JUnit, либо
  2. Совершенно другой и лучший способ тестирования многопоточного кода в JUnit, или
  3. Способ моделирования асинхронного кода в одном потоке

Спасибо за любые идеи!

8
задан Riley Lark 11 December 2011 в 20:12
поделиться