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

有一条消息(文本),我确定知道哪种格式和内容。
目前,实现了Java中用于从文件中解析和读取此消息的类。

在现实世界中,此消息将来自Message Queue。

现在我应该在我的本地PC上模拟,模拟或生成Message Queue以进行测试。

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代码中以programmaticaly方式模拟它? 我能以某种方式嘲笑它吗?

谢谢。

如果使用Spring Integration ,则可以非常轻松地完成此操作。 它有一个非常基本的抽象“通道”实现。 您可以创建和测试您的生产者和消费者,当您准备好进一步前进时,您只需在Channel上指定一个JMS适配器。

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

至于进程内JMS,你可以看看SomnifugiJMS 。

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

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

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

  3. JMS类mock:您可以在unit testing中使用Mockito来模拟与JMS类的交互。 该解决方案伴随着unit testing的所有权衡。 有关那些看到测试金字塔的更多信息。 如果您想对应用程序进行黑盒测试,请使用我上面描述的解决方案之一。

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