24

有一条消息(文本),我绝对知道它的格式和内容。
现在,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 代码以编程方式模拟它?我可以以某种方式嘲笑它吗?

谢谢。

4

4 回答 4

10

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

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

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

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

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

于 2017-12-08T13:06:45.003 回答
6

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

于 2010-10-19T18:04:37.213 回答
0

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

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

于 2010-10-19T16:53:13.687 回答
-2

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

于 2010-10-19T19:00:39.420 回答