Интеграция Spring: тестирование логики, зависимой от poller

Интересно, как я могу написать весенние тесты для утверждения логической цепочки, которая запускается SourcePollingChannelAdapter.

Что приходит мне в голову:

  • используйте Thread.sleep(), который действительно плохая идея для тестов
  • Иметь другую тестовую версию контекста Spring, где я заменю все каналы, которые можно опрашивать, прямыми. Это требует много работы.

Существуют ли распространенные способы принудительного запуска триггера в тесте?

1 ответ

Решение

Обычно мы используем QueueChannel в наших тестах и ​​ждать сообщений через его receive(10000) метод. Таким образом, независимо от источника данных, поток нашего метода тестирования блокируется до тех пор, пока данные не поступят.

SourcePollingChannelAdapter вызвано TaskSchedulerследовательно, вся логика потока выполняется в отдельном потоке от метода тестирования. Я имею в виду, что твоя идея о замене каналов не поможет. Thread.sleep() может иметь значение, но QueueChannel.receive(10000) это очень надежно, потому что мы действительно максимально ждем только эти 10 секунд.

Еще один способ блокировки тест-кейса исходит из стандартного CountDownLatchкоторый вы бы countDown() где-то в потоке и ждать его в методе испытаний.

Есть еще один способ проверки: сделать цикл с коротким периодом ожидания между итерациями и проверить некоторые условия для выхода и проверки. Это может быть полезно в случае опроса и базы данных в конце. Таким образом, мы выполняем SELECT в этом цикле до желаемого состояния.

Вы можете найти дополнительную информацию в Справочном руководстве.

Другие вопросы по тегам