Spring JMS-тестирование и откат транзакций - PullRequest
2 голосов
/ 06 октября 2011

У меня есть тестовый комплект, использующий Spring * SpringJUnit4ClassRunner (который автоматически откатывает обновления БД в конце каждого теста JUnit). Теперь я хочу проверить мой JMS-код на основе Spring:

  1. Создан элемент БД
  2. Сообщение JMS отправляется, чтобы сделать что-то
  3. MDP принимает сообщение и делает что-то еще в БД

На самом деле в Тесте происходит следующее:

  1. Spring начинает транзакцию (tx1) в потоке 1
  2. Элемент БД создается в контексте tx1
  3. Сообщение JMS отправлено
  4. Откат tx1 откатывается и нить 1 выходит
  5. Поток 2 раскручивает MDP, начинает транзакцию tx2, читает сообщение и работает ли БД
  6. Поток 2 фиксирует tx2, так как тестовая проводка не раскручивается и выходит

Я хочу, чтобы tx1 и tx2 контролировались SpringJUnit4ClassRunner, поэтому я получаю автоматический откат. Еще лучше было бы, если бы они могли использовать один и тот же общий транзакционный контекст; прямо сейчас, если что-то сохранено в tx1, даже если поток 1 не откатил этот tx, tx2 не видит изменений в БД.

1 Ответ

2 голосов
/ 06 октября 2011

Вам необходимо использовать диспетчер транзакций, который поддерживает XA и, таким образом, может выполнять двухфазную фиксацию для базы данных и механизма JMS. Существует несколько таких менеджеров транзакций (Bitronix, Atomikos и т. Д.), Которые можно бесплатно получить.

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

  • тот, где макет JMS-части (только для проверки создания элемента БД),
  • и один, где проверяется только обработка сообщений JMS

Обратите внимание, что без XA вам, вероятно, придется обрабатывать странные ситуации, когда сообщение JMS обрабатывается, тогда как первая транзакция еще не зафиксирована, или когда транзакция базы данных завершена, но отправка сообщения не удалась.

...