gpt4 book ai didi

apache-camel - 测试 Camel 路线时如何正确使用 Mocks?

转载 作者:行者123 更新时间:2023-12-04 17:47:33 25 4
gpt4 key购买 nike

我正在尝试编写一个 Camel 测试来检查以确保基于内容的路由器正确路由 XML 文件。这是我的 blueprint.xml 中的端点和路由:

<endpoint uri="activemq:queue:INPUTQUEUE" id="jms.queue.input" />
<endpoint uri="activemq:queue:QUEUE1" id="jms.queue.1" />
<endpoint uri="activemq:queue:QUEUE2" id="jms.queue.2" />

<route id="general-jms.to.specific-jms">
<from ref="jms.queue.input" />
<choice>
<when>
<xpath>//object-type = '1'</xpath>
<log message="Sending message to queue: QUEUE1" />
<to ref="jms.queue.1" />
</when>
<when>
<xpath>//object-type = '2'</xpath>
<log message="Sending message to queue: QUEUE2" />
<to ref="jms.queue.2" />
</when>
<otherwise>
<log message="No output was able to be determined based on the input." />
</otherwise>
</choice>
</route>

现在,我要做的就是发送一个带有 <object-type> 的示例源文件。 1 并验证它是否路由到正确的队列 (QUEUE1) 并且是正确的数据(应该只是将整个 XML 文件发送到 QUEUE1)。这是我的测试代码:
public class RouteTest extends CamelBlueprintTestSupport {

@Override
protected String getBlueprintDescriptor() {
return "/OSGI-INF/blueprint/blueprint.xml";
}

@Override
public String isMockEndpointsAndSkip() {
return "activemq:queue:QUEUE1";
}

@Test
public void testQueue1Route() throws Exception {

getMockEndpoint("mock:activemq:queue:QUEUE1").expectedBodiesReceived(context.getTypeConverter().convertTo(String.class, new File("src/test/resources/queue1-test.xml")));

template.sendBody("activemq:queue:INPUTQUEUE", context.getTypeConverter().convertTo(String.class, new File("src/test/resources/queue1-test.xml")));

assertMockEndpointsSatisfied();
}
}

当我运行这个测试时,我看到我放在路由定义中的日志消息说它正在将它发送到 QUEUE1,但 JUnit 测试失败并显示以下错误消息:java.lang.AssertionError: mock://activemq:queue :QUEUE1 接收到的消息计数。预期:<1>,但为:<0>。

有人可以帮助我了解我做错了什么吗?

我的理解是 Camel 会自动模拟 QUEUE1 端点,因为我覆盖了 isMockEndpointsAndSkip()并提供了 QUEUE1 端点 uri。我认为这意味着我应该能够在 getMockEnpoint() 中使用该端点。方法只需将“模拟:”附加到 uri 的开头。然后我应该有一个模拟端点,我可以对其设置期望(即必须有输入文件)。

如果我对某些事情不清楚,请告诉我,非常感谢您的帮助!

最佳答案

解决方法是使用 CamelTestSupport.replaceRouteFromWith .

这个方法完全没有任何文档,但是在像这样调用它时它对我有用:

public class FooTest extends CamelTestSupport {

@Override
public void setUp() throws Exception {
replaceRouteFromWith("route-id", "direct:route-input-replaced");
super.setUp();
}

// other stuff ...

}

这也会阻止 from 的原始消费者的启动。路线的目的地。例如,这意味着当要测试具有 activemq 使用者的路由时,不再需要运行 activemq 实例。

关于apache-camel - 测试 Camel 路线时如何正确使用 Mocks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com