Смоделируйте или смоделируйте очередь сообщений (JMS) - PullRequest
19 голосов
/ 19 октября 2010

Есть сообщение (текст), формат и содержание которого я точно знаю.На данный момент реализован класс в Java, который анализирует и читает это сообщение из файла.

В реальном мире это сообщение будет приходить из очереди сообщений.

А пока я должен смоделировать, mockили сгенерируйте очередь сообщений на моем локальном ПК для тестирования.

Спецификация 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-клиент - это мой класс, который читает сообщения. Сообщение Сам я знаю.

Итак, вопрос в том, как запустить очередь сообщений?Как я могу симулировать это программно из кода Java?Могу я как-то высмеять это?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 19 октября 2010

Если вы используете Spring Integration , вы можете сделать это довольно легко. У этого есть очень базовая, абстрактная реализация "Канала". Вы можете создавать и тестировать своих производителей и потребителей, а когда вы будете готовы сделать еще один шаг, вы просто указываете адаптер JMS в верхней части своего канала.

1 голос
/ 08 декабря 2017

Чтобы протестировать приложение изолированно, когда реальный производственный JMS-провайдер недоступен, вы можете использовать одно из:

  1. JMS mock: При тестировании ваших приложений вы можете моделировать несуществующие зависимости, используя test doubles . Вы можете использовать макет JMS, который будет имитировать поведение реального провайдера JMS. Инструменты моделирования API позволят вам создавать макеты JMS (просто выберите инструмент, поддерживающий JMS, например Traffic Parrot ). Использование макета JMS позволит вам обеспечить высокий уровень гибкости во время тестирования. Вы сможете тестировать типичные производственные тестовые сценарии, а также гипотетические ситуации, настроив свой макет так, чтобы он возвращал практически любой тип сообщения. Вы также сможете симулировать различные типы ошибок, что часто бывает трудно сделать с настоящими провайдерами JMS. Взгляните на это вводное видео по виртуализации сервисов JMS для ActiveMq (виртуализация сервисов - это другое название макета) или для IBM MQ . Обратите внимание, что эти видео взяты из Traffic Parrot, но принцип, описанный там, будет применяться к любому инструменту, который вы выберете.

  2. Тестовый экземпляр провайдера JMS: Вы можете запустить провайдера JMS на своем ноутбуке или в одной из ваших тестовых сред и подключить к нему свое приложение вместо производственного провайдера. Когда вы используете в своем производстве провайдеров с открытым исходным кодом, таких как ActiveMQ или RabbitMQ, один из них должен быть легко запущен на вашем ноутбуке, потому что он легкий и бесплатный. Для IBM Websphere MQ вы можете использовать бесплатный IBM MQ для разработчиков .

  3. Макет JMS-класса: Вы можете использовать Mockito в модульных тестах для имитации взаимодействия с классами JMS. Это решение поставляется со всеми компромиссами модульного тестирования. Для получения дополнительной информации о них см. тестирование пирамиды . Если вы хотите протестировать свое приложение в «черном ящике», воспользуйтесь одним из описанных выше решений.

1 голос
/ 19 октября 2010

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

Что касается внутрипроцессного JMS, вы можете посмотреть на SomnifugiJMS .

0 голосов
/ 19 октября 2010

Вообще я согласен с Евгением Кулешовым.Но если вам все еще нужны такие насмешки, я бы предложил вам использовать BlckingQueue из пакета java.util.concurent.Я думаю, что это не большая проблема, чтобы обернуть его с помощью интерфейса javax.jms.Queue.Кстати, это хорошая идея для какого-то проекта с открытым исходным кодом.

...