如何对 JMS 代码进行单元测试
常见问题解答 > JMS > 如何对 JMS 代码进行单元测试
在对使用 JMS 的代码进行单元测试时,通常需要避免运行独立进程的开销;此外,还希望尽可能缩短启动时间,因为通常会频繁运行单元测试,并希望获得即时反馈。持久化也会造成问题,因为以前的测试用例结果可能会对将来的测试用例运行产生负面影响,因此通常需要在启动时清除队列。
因此,在对 JMS 代码进行单元测试时,建议执行以下操作
可以使用以下 Java 代码来创建 JMS ConnectionFactory
,该代码也会自动创建嵌入式代理
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://127.0.0.1?broker.persistent=false");
有关更多配置选项,请参阅 VM 传输参考 和 代理配置 URI
或者,如果您确实希望更明确地创建代理,可以使用以下 Java 代码
BrokerService broker = new BrokerService();
broker.setPersistent(false);
broker.start();
或者可以使用 Spring 支持。
使用 JNDI
如果您的应用程序代码正在使用 JNDI 来查找要使用的 JMS ConnectionFactory
和 Destination
,那么可以使用 ActiveMQ Classic 中的 JNDI 支持。
将以下 jndi.properties
添加到您的类路径中(例如,如果您使用的是 Maven,则添加到 src/test/resources
中)
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = vm://127.0.0.1?broker.persistent=false
然后,您应该考虑使用 JNDI 中的动态目标,以便您的代码通过以下方式查找目标
context.lookup("dynamicQueues/FOO.BAR");
使用 EmbeddedActiveMQBroker
JUnit 规则(ActiveMQ 5.13)
如果您的测试代码使用的是 JUnit,那么可以使用 activemq-junit
库中提供的 EmbeddedActiveMQBroker
JUnit 规则。将 activemq-junit
库以及您要测试的 ActiveMQ Classic 版本的 activemq-broker
库添加到其中。该规则将使用它在类路径中找到的 ActiveMQ Classic 版本,因此如果 ActiveMQ Classic 库尚未存在,则需要指定它们。
如果您使用的是 Maven,请将以下内容添加到您的 pom.xml
中
<dependency>
<groupId>org.apache.activemq.tooling</groupId>
<artifactId>activemq-junit</artifactId>
<version>${activemq-junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
<version>${activemq-version}</version>
<scope>test</scope>
</dependency>
然后将 EmbeddedActiveMQBroker
JUnit 规则添加到您的测试中,JUnit 将在每个测试开始时启动嵌入式代理,并在测试结束时停止代理。
使用 ActiveMQ Classic JUnit 规则
@Rule
public EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker();
默认情况下,EmbeddedActiveMQBroker
将配置代理为非持久性,并且唯一可用的传输将是 VM 传输。要自定义此配置,请扩展 EmbeddedActiveMQBroker
类并覆盖 configure()
方法,或者使用代理的 XML 配置。
注意:要使用 XML 配置配置 EmbeddedActiveMQBroker
,您可能需要将其他库添加到类路径中,以支持 ActiveMQ 的 XBean 配置。
使用 Java 自定义 EmbeddedActiveMQBroker
@Rule
EmbeddedActiveMQBroker customizedBroker = new EmbeddedActiveMQBroker() {
@Override
protected void configure() {
// Perform additional configuration here...
}
}
使用 XML 配置自定义 EmbeddedActiveMQBroker
@Rule
EmbeddedActiveMQBroker customizedBroker = new EmbeddedActiveMQBroker("bean:customize-activemq.xml");
请注意,要使用 XML 配置,您可能需要将其他库添加到类路径中,以支持 ActiveMQ Classic 的 XBean 配置。 spring-context
库的版本应与您选择的 ActiveMQ Classic 版本使用的版本相对应。
XBean 配置的 Maven 配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>Appropriate version for activemq-version</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>${activemq-version></version>
</dependency>
然后可以使用 VM URI 连接到代理
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://embedded-broker?create=false");
您也可以从 EmbeddedActiveMQBroker
获取连接工厂
ConnectionFactory connectionFactory = embeddedBroker.createConnectionFactory();