Apache camel 如何在单独的camel上下文中模拟camel端点

Apache camel 如何在单独的camel上下文中模拟camel端点,apache-camel,Apache Camel,我正在为一个对最终用户隐藏骆驼业务的库编写测试用例。 该库公开了sendMessages()等方法,并在内部使用ProducerTemplate将消息发送到一个驼峰路由,在该路由中,消息被聚合并最终发送到目标 我希望能够编写调用库方法并模拟驼峰路由端点的测试,以便稍后对其进行断言 如果我使用CamelSpringTestSupport,它基本上会创建一个新的ClassPathXmlApplicationContext,使用它我可以测试路由 但是,我想测试在库的camel上下文中创建的端点,以便测

我正在为一个对最终用户隐藏骆驼业务的库编写测试用例。 该库公开了sendMessages()等方法,并在内部使用ProducerTemplate将消息发送到一个驼峰路由,在该路由中,消息被聚合并最终发送到目标

我希望能够编写调用库方法并模拟驼峰路由端点的测试,以便稍后对其进行断言

如果我使用CamelSpringTestSupport,它基本上会创建一个新的ClassPathXmlApplicationContext,使用它我可以测试路由

但是,我想测试在库的camel上下文中创建的端点,以便测试也覆盖库代码

可以这样做吗?

使用Camel动态更改路由行为(拦截交换并发送到模拟端点进行验证等)。它非常灵活,并利用了熟悉的模拟端点等

例如…截获发送到
直接:开始
路由的消息

context.getRouteDefinition("myRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
    @Override
    public void configure() throws Exception {
       interceptSendToEndpoint("direct:start")
                .skipSendToOriginalEndpoint()
                .to("mock:start");
    }
});

getMockEndpoint("mock:start").expectedBodiesReceived("Hello World");

我的最后一个测试用例如下所示,其中现有上下文的路由被模拟

import org.apache.camel.Exchange;
导入org.apache.camel.builder.AdviceWithRouteBuilder;
导入org.apache.camel.component.mock.MockEndpoint;
导入org.apache.camel.test.spring.CamelSpringTestSupport;
导入org.junit.Assert;
导入org.junit.BeforeClass;
导入org.junit.Test;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.context.support.AbstractApplicationContext;
导入org.springframework.test.annotation.DirtiesContext;
导入java.net.URL;
导入java.nio.file.path;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共类MyAppTest扩展了对SpringTest的支持{
私有静态MyApp-MyApp;
受保护的最终记录器日志=LoggerFactory.getLogger(MyAppTest.class);
@凌驾
受保护的AbstractApplicationContext createApplicationContext(){
返回(AbstractApplicationContext)myApp.getContext();
}
@凌驾
公共布尔值isUseAdviceWith(){
//告诉我们正在使用建议,这使我们能够建议路线
//在Camel启动之前,可以使用其他东西替换myApp端点。
返回true;
}
@课前
public static void oneTimeSetUp()引发异常{
myApp=新的myApp();
}
@试验
@肮脏的环境
public void test01()引发异常{
log.info(“测试:将advideWith条款应用于现有路线”);
context.getRouteDefinition(“bulkIndexRoute”).adviceWith(context,new AdviceWithRouteBuilder(){
@凌驾
public void configure()引发异常{
weaveByToString(“%myAppEndpoint.*”)
.替换()
.aggregate(标题(“ABC”),新ArrayListageGationStrategy())
.completionSize(100)
.completionInterval(1000)
。至(“mock:foo”);
}
});
log.info(“测试:应用adviceWith条款完成”);
MockEndpoint mockedES=getMockEndpoint(“mock:foo”);
mockedES.expectedMessageCount(2);
mockedES.setAssertPeriod(10000);
//创建150个测试文档并对它们进行索引
对于(int i=0;i<150;i++){
Map d=新的HashMap();
d、 put(“键1”、“值”+i);
d、 put(“键2”、“值”+i);
myApp.send(“参数1”、“参数2”、d);
}
mockedES.assertessatified();
整数计数=0;
for(Exchange ex:mockedES.getExchanges()){
List documentList=ex.getIn().getBody(List.class);
count+=documentList.size();
}
Assert.assertEquals(“接收回150条消息”,150,计数);
}
}
MyApp类将上下文返回给测试,以便可以模拟运行上下文中的路由