如何对 JMS 代码进行单元测试

 常见问题解答 > JMS > 如何对 JMS 代码进行单元测试

在对使用 JMS 的代码进行单元测试时,通常需要避免运行独立进程的开销;此外,还希望尽可能缩短启动时间,因为通常会频繁运行单元测试,并希望获得即时反馈。持久化也会造成问题,因为以前的测试用例结果可能会对将来的测试用例运行产生负面影响,因此通常需要在启动时清除队列。

因此,在对 JMS 代码进行单元测试时,建议执行以下操作

  • 使用 嵌入式代理 来避免需要独立代理进程。
  • 禁用 代理持久化,这样就不需要在测试前后清除队列。
  • 通常,使用 Java 代码通过 XML 配置文件(使用 Spring 等)创建代理更简单、更快。

可以使用以下 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 ConnectionFactoryDestination,那么可以使用 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();

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。