用于 ActiveMQ 的 Camel 路由的 JUnit 测试用例

JUnit test case for Camel route for ActiveMQ

我在 MyRouteBuilder.java 文件中有一个 camel 路由,它正在使用来自 ActiveMQ 的消息:

from("activemq:queue:myQueue" )
.process(consumeDroppedMessage)
.log(">>> I am here");

我为以下内容编写了一个测试用例:

@Override
public RouteBuilder createRouteBuilder() throws Exception {
    return new MyRouteBuilder();
}

@Test
void testMyTest() throws Exception {
    String queueInputMessage = "My Msg";
    template.sendBody("activemq:queue:myQueue", queueInputMessage);
    assertMockEndpointsSatisfied();

}

当我 运行 单元测试用例时,我得到这个奇怪的错误:

7:53:26.175 [main] DEBUG org.apache.camel.impl.engine.InternalRouteStartupManager - Route: route1 >>> Route[activemq://queue:null -> null]
17:53:26.175 [main] DEBUG org.apache.camel.impl.engine.InternalRouteStartupManager - Starting consumer (order: 1000) on route: route1
17:53:26.175 [main] DEBUG org.apache.camel.support.DefaultConsumer - Build consumer: Consumer[activemq://queue:null]
17:53:26.185 [main] DEBUG org.apache.camel.support.DefaultConsumer - Init consumer: Consumer[activemq://queue:null]
17:53:26.185 [main] DEBUG org.apache.camel.support.DefaultConsumer - Starting consumer: Consumer[activemq://queue:null]
17:53:26.213 [main] DEBUG org.apache.activemq.thread.TaskRunnerFactory - Initialized TaskRunnerFactory[ActiveMQ Task] using ExecutorService: java.util.concurrent.ThreadPoolExecutor@3fffff43[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
17:53:26.215 [main] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Reconnect was triggered but transport is not started yet. Wait for start to connect the transport.
17:53:26.334 [main] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Started unconnected
17:53:26.334 [main] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Waking up reconnect task
17:53:26.335 [ActiveMQ Task-1] DEBUG org.apache.activemq.transport.failover.FailoverTransport - urlList connectionList:[tcp://localhost:61616], from: [tcp://localhost:61616]
17:53:26.339 [main] DEBUG org.apache.camel.component.jms.DefaultJmsMessageListenerContainer - Established shared JMS Connection
17:53:26.340 [main] DEBUG org.apache.camel.component.jms.DefaultJmsMessageListenerContainer - Resumed paused task: org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker@58c34bb3
17:53:26.372 [ActiveMQ Task-1] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Attempting 0th connect to: tcp://localhost:61616
17:53:28.393 [ActiveMQ Task-1] DEBUG org.apache.activemq.transport.failover.FailoverTransport - Connect fail to: tcp://localhost:61616, reason: {}

看到这些消息我特别难过:

Route: route1 >>> Route[activemq://queue:null -> null]

urlList connectionList:[tcp://localhost:61616], from: [tcp://localhost:61616]

尽管我有正确的队列名称,但为什么队列显示为 null?还有为什么经纪人urltcp://localhost:61616?

我想 运行 这个单元测试用例,以便它 运行 在所有环境中都能正常运行,例如:本地、DIT、SIT、PROD 等。因此,为此我买不起经纪人url 为:tcp://localhost:61616.

关于我在这里做错了什么以及我应该做什么有什么想法吗?

编辑 1:
我看到的问题之一是甚至在调用测试 class 之前,调用 createRouteBuilder() 中的 MyRouteBuilder(),导致我在日志中看到的问题。

“activemq:queue:..”告诉 Camel 在幕后使用 auto-configure 魔法(使用默认值 url),而您的用例超出了这个范围。

您需要配置连接工厂 (ActiveMQConnectionFactory) 并配置 camel-jms 组件以使用该连接工厂。

连接工厂允许您指定 url、用户名、密码、默认连接设置和设置 SSL。

最佳做法是将 url、用户名、密码和队列外部化到一个属性文件中,这样您就可以跨环境(本地、DIT、SIT 和 prod 等)更改它们

注意:使用 org.apache.camel/camel-jms 组件,而不是 org.apache.activemq/activemq-camel 组件。 activemq-camel 已弃用并在 ActiveMQ 5 中被删除。17.x。

我开始使用 VM 代理,而不是设置显式活动的 mq 代理。

@Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() {
                ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
                ActiveMQComponent activeMQComponent = new ActiveMQComponent();
                activeMQComponent.setConnectionFactory(connectionFactory);
                context.addComponent("activemq", activeMQComponent);
                from("activemq:queue:myQueue").to("mock:collector");
            }
        };
    }

另外,我把 camel junit 误认为是传统的 junit。我们不需要显式调用实际的路由构建器 class 。相反,在上面设置我的 activeMq 组件之后,我能够编写我的测试方法,模拟我的队列端点并发送消息并断言它们。 Camel 真是多才多艺。不过需要大量学习。