模拟或模拟消息队列 (JMS)

Posted

技术标签:

【中文标题】模拟或模拟消息队列 (JMS)【英文标题】:Mock or simulate Message Queue (JMS) 【发布时间】:2011-04-27 14:25:00 【问题描述】:

有一条消息(文本),我肯定知道它的格式和内容。 目前,已经实现了 Java 中的类,它解析并从文件中读取此消息。

在现实世界中,这条消息将来自消息队列。

现在我应该在本地 PC 上模拟、模拟或生成消息队列以进行测试。

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 代码以编程方式模拟它?我可以以某种方式模拟它吗?

谢谢。

【问题讨论】:

为什么要这么麻烦?为什么不在您的工作站上安装本地 JMS 提供程序并使用它呢?您可以下载供应商 JMS 提供程序的开源版本和试用版。由于它是 JMS,因此任何兼容的实现都适用于单元测试。 那是我问的,所以我需要安装 JMS 提供程序。你能给我什么建议?谢谢 好吧,我是IBMer,所以我不得不建议试用WMQ。 :-) 但是我看到您已经找到了 ActiveMQ,您可以将其用于开发而不会过期。另一方面,无论你在生产中使用什么,最好继续开发,所以一旦你知道它会是什么,就开始开发。 模拟 JMS 队列的简单方法。请参考以下网站dzone.com/articles/mockrunner-jms-spring-unit 【参考方案1】:

通常,模拟或模拟外部系统(例如 JMS)是一种不好的做法。一个更好的想法是将您的逻辑抽象为一个独立的 bean,实现一个委托层,将 JMS 与您的 bean 连接起来。通过这样的设计,您可以独立于 JMS 测试您的 bean,然后进行系统测试,以测试与真实 JMS 系统的整个集成。

至于进程内JMS可以看SomnifugiJMS。

【讨论】:

我完全不同意。模拟外部系统对于单元测试至关重要,尤其是当您依赖外部接口并且不想将单元测试转变为集成测试时。 @ank - 模拟外部系统一种不好的做法。解决方案是在您自己的应用程序(Eugene Kuleshov 所指的 bean)中为该系统创建一个接口,该接口处理与外部系统的通信,然后在测试中模拟 that。试图模拟整个外部系统既昂贵又混乱。 @Ickster 那是模拟的定义……(我知道这很老了,但是)你能举一个例子来说明你认为你正在做的区别吗? @davemyron -- 好问题。我知道我当时正在做一些事情,我写的那是我试图达到的一个完美的例子,但如果我能准确地记住它是什么,那该死的。如果我想到了,我会告诉你的。 最近,wiremock.org、hoverfly.io 和 mbtest.org 等工具在为 HTTP API 创建进程外(在线)模拟方面变得越来越流行。进程外模拟的相同原理也可以应用于 JMS API 以及支持 JMS 的 API 模拟工具en.wikipedia.org/wiki/Comparison_of_API_simulation_tools 我在这里提到了 HTTP,因为它比 JMS 更流行并且更容易看到那里的市场趋势。 【参考方案2】:

如果你使用Spring Integration,你可以很容易地做到这一点。它有一个非常基本的、抽象的“通道”实现。您可以创建和测试您的生产者和消费者,当您准备更进一步时,您只需在您的 Channel 之上指定一个 JMS 适配器。

【讨论】:

【参考方案3】:

总的来说,我同意 Eugene Kuleshov 的观点。但是,如果您仍然需要这样的模拟,我建议您使用 java.util.concurent 包中的 BlckingQueue。我认为用 javax.jms.Queue 接口包装它不是一个大问题。顺便说一句,这对于某种开源项目来说是个好主意。

【讨论】:

我刚刚找到了 Apache ActiveMQ。先试试这个。【参考方案4】:

要在真正的生产 JMS 提供程序不可用时单独测试应用程序,您可以使用以下之一:

    JMS 模拟: 在测试您的应用程序时,您可以使用test doubles 模拟不存在的依赖项。您可以使用 JMS 模拟来模拟真实 JMS 提供者的行为。 API simulation tools 将允许您创建 JMS 模拟(只需选择支持 JMS 的工具,例如 Traffic Parrot)。使用 JMS 模拟将使您在测试期间获得高度的灵活性。您将能够通过设置您的模拟以返回几乎任何类型的消息来测试典型的类似生产的测试场景以及假设情况。您还可以模拟不同类型的错误,这对于真正的 JMS 提供程序通常很难做到。查看this introduction video to JMS service virtualization for ActiveMq(服务虚拟化是模拟的不同名称)或this one for IBM MQ。请注意,这些视频来自 Traffic Parrot,但其中描述的原则适用于您选择的任何工具。

    JMS 提供者测试实例: 您可以在您的笔记本电脑或您的一个测试环境中运行 JMS 提供程序,并将您的应用程序连接到它而不是生产提供程序。当您在生产环境中使用诸如 ActiveMQ 或 RabbitMQ 之类的开源提供程序时,应该很容易在您的笔记本电脑上运行其中一个,因为它们是轻量级且免费的。对于 IBM Websphere MQ,您可以使用免费的IBM MQ for Developers。

    JMS 类模拟: 您可以在单元测试中使用 Mockito 来模拟与 JMS 类的交互。该解决方案带有单元测试的所有权衡。有关这些的更多信息,请参阅testing pyramid。

如果您想对您的应用程序进行黑盒测试,请使用我上面描述的解决方案之一。

【讨论】:

以上是关于模拟或模拟消息队列 (JMS)的主要内容,如果未能解决你的问题,请参考以下文章

Java消息队列--JMS概述

Java消息队列--JMS概述

Java消息队列--JMS概述

JMS

使用Java模拟消费者是如何消费rabbitMQ消息队列中的消息的

分布式消息队列之JMS规范(总结篇)