Макет или имитация очереди сообщений (JMS)
Есть сообщение (текст), формат и содержание которых я точно знаю.
На данный момент реализован класс в Java, который анализирует и читает это сообщение из файла.
В реальном мире это сообщение будет отправлено из очереди сообщений.
Теперь я должен имитировать, высмеивать или генерировать очередь сообщений на своем локальном ПК для тестирования.
Спецификация Java (java jms):
JMS provider: A messaging system that implements the JMS specification.
JMS clients: Java applications that send and receive messages.
Messages: Objects that are used to communicate information between JMS clients.
Что касается этой спецификации, мне нужен поставщик JMS.
JMS client - это мой класс, который читает сообщение.
Само сообщение, которое я знаю.
Итак, вопрос в том, как запустить очередь сообщений?
Как я могу имитировать его программным образом из кода Java? Могу ли я издеваться над этим?
Спасибо.
Ответы
Ответ 1
Если вы используете Spring Интеграция, вы можете сделать это довольно легко. Он имеет очень базовую абстрактную реализацию "Канала". Вы можете создавать и тестировать своих производителей и потребителей, и когда вы будете готовы двигаться дальше, вы просто укажете JMS-адаптер поверх своего канала.
Ответ 2
Как правило, это неправильная практика для издевательства или моделирования внешней системы, такой как JMS. Лучше всего было бы абстрагировать вашу логику в автономном bean, реализовать слой делегирования, который мог бы соединить JMS с вашим bean. С таким дизайном вы можете протестировать свой bean отдельно от JMS, а затем провести системный тест, который бы протестировал всю интеграцию с реальной системой JMS.
Что касается встроенной JMS, вы можете посмотреть SomnifugiJMS.
Ответ 3
Чтобы протестировать приложение отдельно, если настоящий JMS-провайдер недоступен, вы можете использовать один из:
-
JMS mock: При тестировании ваших приложений вы можете имитировать несуществующие зависимости, используя test doubles. Вы можете использовать JMS mock, который будет имитировать поведение реального JMS-провайдера. Инструменты моделирования API позволят вам создавать JMS mocks (просто выберите инструмент, поддерживающий JMS, например Traffic Parrot). Использование JMS mock позволит вам проявить большую гибкость во время тестирования. Вы сможете протестировать типичные тестовые сценарии производства, а также гипотетические ситуации, настроив свой макет, чтобы возвращать почти любой тип сообщения. Вы также сможете моделировать различные типы ошибок, которые часто трудно сделать с реальными поставщиками JMS. Посмотрите это видео для ознакомления с виртуализацией службы JMS для ActiveMq (виртуализация служб - другое имя для макета) или этот для IBM MQ. Обратите внимание, что эти видеоролики относятся к Traffic Parrot, но описанный там принцип применим к любому инструменту, который вы выберете.
-
Пример тестирования JMS-провайдера:. Вы можете запустить JMS-провайдер на своем ноутбуке или в одной из тестовых сред и подключить к нему приложение вместо поставщика. Когда вы используете поставщиков с открытым исходным кодом в таких продуктах, как ActiveMQ или RabbitMQ, вам также должно быть легко запустить один из них на вашем ноутбуке, потому что они легки и свободны. Для IBM Websphere MQ вы можете использовать бесплатный IBM MQ для разработчиков.
-
JMS class mock: Вы можете использовать Mockito в модульных тестах, чтобы имитировать взаимодействия с JMS. Это решение поставляется со всеми компромиссами модульного тестирования. Для получения дополнительной информации о них см. тестирование пирамиды. Если вы хотите, чтобы черный ящик тестировал ваше приложение, используйте одно из решений, описанных выше.
Ответ 4
В общем, я согласен с Евгением Кулешовым. Но если вам все еще нужно такое издевательство, я предлагаю вам использовать BlckingQueue из пакета java.util.concurent. Я думаю, что это не большая проблема, связанная с интерфейсом javax.jms.Queue. Кстати, это хорошая идея для какого-то проекта с открытым исходным кодом.