我正在编写一个应用程序,使用camel在fuse容器中部署(最终)。该项目的性质要求我混合和匹配Java和XML。
我很难让模拟框架与蓝图一起正常工作。
下面是我的单元测试,完全基于示例这里。
public class MockNotWorking extends CamelBlueprintTestSupport {
@Test
public void testAdvisedMockEndpointsWithPattern() throws Exception {
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
mockEndpoints("log*");
}
});
getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");
getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
template.sendBody("direct:start", "Hello World");
// additional test to ensure correct endpoints in registry
assertNotNull(context.hasEndpoint("direct:start"));
assertNotNull(context.hasEndpoint("log:foo"));
assertNotNull(context.hasEndpoint("mock:result"));
// only the log:foo endpoint was mocked
assertNotNull(context.hasEndpoint("mock:log:foo"));
assertNull(context.hasEndpoint("mock:direct:start"));
assertNull(context.hasEndpoint("mock:direct:foo"));
assertMockEndpointsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").to("direct:foo").to("log:foo").to("mock:result");
from("direct:foo").transform(constant("Bye World"));
}
};
}
protected String getBlueprintDescriptor() {
return "OSGI-INF/blueprint/blueprint.xml";
}
}
我逐字复制了示例这里,并对其进行了非常轻微的修改,因此我们扩展了CamelBlueprintTestSupport
而不是CamelTestSupport
。这需要超越getBlueprintDescriptor
来指向我的蓝图xml,在该蓝图中,我定义了一个非常基本(与测试完全无关)的路由:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<camelContext id="validationRoute" xmlns="http://camel.apache.org/schema/blueprint" >
<route id="validation">
<from uri="direct:validation" />
<log message="validating..." />
</route>
</camelContext>
</blueprint>
测试失败的有:
java.lang.AssertionError: mock://log:foo Received message count. Expected: <1> but was: <0>
因此,这意味着消息没有到达模拟端点。将CamelBlueprintTestSupport
更改为CamelTestSupport
,它就能工作了。
那么,我如何让这样的模拟与蓝图正确地工作呢?
发布于 2016-04-21 11:07:56
使用蓝图时,它会导入蓝图xml文件中定义的所有路由,并将它们添加到CamelContext
中。
这破坏了一切的原因是context.getRouteDefinitions().get(0)
不再指唯一的路线--现在不止一条了。因此,当您添加AdviceWithRouteBuilder
时,可能会将它添加到错误的路径中。
以下代码修复了问题(并且也适用于非蓝图测试):
List<RouteDefinition> routes = context.getRouteDefinitions();
for (int i=0; i<routes.size(); i++) {
context.getRouteDefinitions().get(i).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// mock all endpoints
mockEndpoints("log*");
}
});
}
======update======
这样做的一个更好的方法是,而不是模仿所有的路线,找到我们的特定路径的id,然后应用通知。这意味着首先设置路径id:
from("direct:start").routeId("start").to("direct:foo").to("log:foo").to("mock:result");
然后通过id查找路由并像以前一样调用adviceWith
:
context.getRouteDefinition("start").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// mock log endpoints
mockEndpoints("log*");
}
});
发布于 2016-04-22 06:29:43
实际上,这取决于你使用的是哪种版本的骆驼,有些方法并不像预期的那样有效。如果我没记错的话,它在2.12之后有了很大的进步。(2.15更好)
在遇到Camel单元测试之后,我最终记录了这里的所有内容:
http://bushorn.com/unit-testing-apache-camel/
http://bushorn.com/camel-unit-testing-using-mock-endpoint/
顺便说一句,我要做的不是这个"mockEndpoints("log*");“而是这样做:
weaveByToString(".direct:foo.").after().to("mock:log");(我知道这听起来很奇怪;)
或者您是否可以设置端点id。
weaveById("endpoint-id-of-direct-foo").after().to("mock:log");
或
weaveAddLast().to("mock:log");
https://stackoverflow.com/questions/36763892
复制相似问题