2013-04-23 2 views
2

Я хочу выполнить тест JUnit для приложения с использованием Spring-Integration. То, что я хочу, чтобы проверить это:Как проверить завершение обработки сообщения или дождаться завершения?

  • Если сообщение было должным образом обработаны службами активатора, подключенного к каналу Я пошлю
  • Если была правильная процедура обработки сообщения об ошибке вызывается в случае каких-либо ошибок

Я использую JMocikt, чтобы проверить, вызваны ли ожидаемые методы. Я начинаю тест, вызывая send на канале сообщений.

Проблема в следующем: Как подождать завершения обработки сообщений? Весенняя интеграция порождает несколько потоков, и отправка по каналу сообщений немедленно возвращается. То, что я уже пытался это:

  • Использования IntegrationMBeanExporter.stopActiveComponents(false, 0) - это не удается из-за прерывания потока
  • Попытка обслуживания активаторы цепи (в первую очередь: фактический вызов, второй: уведомления о завершении) - это не удается, потому что активатор службы при тестировании возвращается null, и в этом случае он не может быть прикован. Кроме того, мне это не нравится, потому что я должен изменить тестовую конфигурацию SI.

Любые подсказки?

Пожалуйста, не прокомментируйте, что вы не выполняете реальный блок, но тестирование интеграции и т. Д. Я знаю, что делаю.

ответ

4

Наиболее распространенным методом, используемым в тестовых случаях, является замена конечного канала QueueChannel, ввод его в тестовый корпус и выполнение assertNotNull(finalChannel.receive(5000). Вы даже можете проверить полученное сообщение, чтобы убедиться, что оно содержит ожидаемые данные.

Это немного сложнее, если вы используете асинхронную обработку, а конечная служба не возвращает результат (или null). В этом случае вы можете сделать последний канал <publish-subscribe-channel/>, а в тестовом случае добавить второго абонента (с более высоким order атрибутом), например <bridge/>, в QueueChannel, а затем результат, как указано выше.

+0

Атрибут заказа делает выполнение последовательным? – Marcin

+0

Порядок разбора используется по умолчанию; Я предпочитаю добавлять явный атрибут порядка каждому подписчику 1, 2, 3 и т. Д. Не больно, если есть только один абонент, и он делает это ясно. Они будут вызываться последовательно, пока '' не имеет многопоточного исполнителя задач. По умолчанию каждый абонент будет вызываться последовательно в потоке, который отправляется на канал. –

+0

Ваш ответ очень полезен, спасибо. Одной из проблем, которые я до сих пор остается, является тот факт, что канал ошибок (насколько мне известно) используется только с асинхронными вызовами. Это вносит большие изменения в процедуру тестирования. – Marcin

Смежные вопросы