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

Java 模拟或模拟消息队列(JMS),java,mocking,jms,message-queue,provider,Java,Mocking,Jms,Message Queue,Provider,有一条消息(文本),我肯定知道它的格式和内容。 现在,实现了Java中的类,该类从文件中解析和读取此消息 在现实世界中,此消息将来自消息队列 目前,我应该在本地PC上模拟、模拟或生成消息队列,以便进行测试 Java规范(): 关于此规范,我需要JMS提供程序 JMS客户端是我的类读取消息。 消息本身我知道 所以问题是如何启动消息队列? 如何从Java代码编程模拟它?我可以嘲笑它吗 谢谢。通常,模拟或模拟外部系统(如JMS)是一种不好的做法。更好的办法是将您的逻辑抽象成一个独立的bean,实现一个

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

在现实世界中,此消息将来自消息队列

目前,我应该在本地PC上模拟、模拟或生成消息队列,以便进行测试

Java规范():

关于此规范,我需要JMS提供程序

JMS客户端是我的类读取消息。
消息本身我知道

所以问题是如何启动消息队列?
如何从Java代码编程模拟它?我可以嘲笑它吗


谢谢。

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


至于进程内JMS,您可以查看。

如果您使用,您可以非常轻松地完成这项工作。它有一个非常基本、抽象的“通道”实现。您可以创建和测试您的生产者和消费者,当您准备更进一步时,您只需在通道顶部指定一个JMS适配器

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

要在实际生产JMS提供程序不可用时单独测试应用程序,您可以使用以下方法之一:

  • JMS模拟:
    测试应用程序时,可以使用模拟不存在的依赖项。您可以使用JMS模拟来模拟真实JMS提供者的行为。将允许您创建JMS模拟(例如,只需选择一个支持JMS的工具)。使用JMS模拟将允许您在测试期间获得高水平的灵活性。通过将模拟设置为返回几乎任何类型的消息,您将能够测试典型的生产测试场景,但也可以测试假设情况。您还可以模拟不同类型的错误,这通常很难使用真正的JMS提供程序。查看(服务虚拟化是模拟的不同名称)或。注意,这些视频来自Traffic Parrot,但这里描述的原理将适用于您选择的任何工具

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

  • JMS类模拟:
    您可以使用单元测试来模拟与JMS类的交互。此解决方案包含单元测试的所有权衡。有关这些方面的更多信息,请参阅


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

    为什么要这么麻烦?为什么不在工作站上安装一个本地JMS提供程序并使用它呢?您可以下载供应商JMS提供者的开源版本和试用版本。因为它是JMS,所以任何兼容的实现都可以用于单元测试。你能给我什么建议?谢谢,我是IBM员工,所以我建议您试用WMQ.:-)但我看到您已经找到了ActiveMQ,可以在不过期的情况下用于开发。另一方面,无论您在生产中使用什么,都最好继续开发,因此,一旦您知道它将是什么,就可以进行开发。模拟JMS队列的简单方法。请参考下面的网站,我刚刚找到ApacheActiveMQ。先试试这个,我完全不同意。模拟外部系统对于单元测试是至关重要的,特别是当您依赖外部接口并且不想将单元测试变成集成测试时。@ank-模拟外部系统是一种不好的做法。解决方案是在您自己的应用程序(Eugene Kuleshov所指的bean)中创建一个到该系统的接口,该接口处理到外部系统的通信,然后在测试中模拟该接口。试图模仿整个外部系统既昂贵又混乱。@Ickster这是模仿的定义…(我知道这很古老,但是)你能举个例子说明你认为自己在做什么吗?@davemyron——好问题。我知道在我写这篇文章的时候,我正在做一些事情,这是我想要得到的一个完美的例子,但是如果我能准确地记得它是什么,那就糟了。如果我想一想,我会让你知道的。最近,像和这样的工具越来越受欢迎,用于为HTTP API创建进程外(在线)模拟。进程外模拟的相同原理也可以应用于jmsapi以及支持JMS的API模拟工具。我在这里提到了HTTP,因为它比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.