骆驼:来自路线中组件的模拟和return值
Camel : Mock and return value from component in route
我的服务中有以下路线:
public void configure() {
/*
* Scheduled Camel route to produce a monthly report from the audit table.
* This is scheduled to run the first day of every month.
*/
// @formatter:off
from(reportUri)
.routeId("monthly-report-route")
.log("Audit report processing started...")
.to("mybatis:updateProcessControl?statementType=Update")
.choice()
/*
* If the rows updated is 1, this service instance wins and can run the report.
* If the rows updated is zero, go to sleep and wait for the next scheduled run.
*/
.when(header("CamelMyBatisResult").isEqualTo(1))
.process(reportDateProcessor)
.to("mybatis:selectReport?statementType=SelectList&consumer.routeEmptyResultSet=true")
.process(new ReportProcessor())
.to("smtp://smtpin.tilg.com?to="
+ emailToAddr
+ "&from=" + emailFromAddr )
.id("RecipientList_ReportEmail")
.endChoice()
.end();
// @formatter:on
}
当我尝试 运行 对此进行测试时,它给了我一个错误,指出 camel 无法自动创建组件 mybatis。我对测试骆驼路线没有经验,所以我不确定该去哪里。第一个 mybatis 调用更新了 table 中的一行,它没有被测试所以我想做一些事情,比如当端点被击中时,return CamelMyBatisResult header 有一个值1. 第二个 mybatis 端点应该 return 一个 hashmap(第一次测试为空,第二次测试为空)。我如何着手实施一种 when/then 类型的骆驼测试机制?我看过模拟端点骆驼文档,但我无法弄清楚如何应用它并将它return作为交换的值,然后继续路由(测试的最终结果是检查发送带或不带附件的电子邮件)
编辑:尝试同时使用 replace().set* 方法并将 mybatis 端点替换为对内联处理器的调用:
@Test
public void test_reportRoute_NoResultsFound_EmailSent() throws Exception {
List<AuditLog> bodyList = new ArrayList<>();
context.getRouteDefinition("monthly-report-route").adviceWith(context,
new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
replaceFromWith(TEST);
weaveById("updateProcControl").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader("CamelMyBatisResult", 1);
}
});
weaveById("selectReport").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody(bodyList);
}
});
weaveById("RecipientList_reportEmail").replace()
.to("smtp://localhost:8083"
+"?to=" + "test@test.com"
+"&from=" + "test1@test1.com");
}
});
ProducerTemplate prod = context.createProducerTemplate();
prod.send(TEST, exch);
assertThat(exch.getIn().getHeader("CamelMyBatisResult"), is(1));
assertThat(exch.getIn().getBody(), is(""));
}
到目前为止,header 仍然是 null,body(TEST 变量是直接分量)
如果您想输入硬编码响应,在您的路线上执行 adviceWith 会更容易。看这里:http://camel.apache.org/advicewith.html
基本上,为每个端点添加一个 id 或 .to()
。然后你的测试执行一个 adviceWith 然后用一些硬编码的响应替换那个 .to() 。它可以是地图、字符串或您想要的任何其他内容,它将被替换。例如:
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// weave the node in the route which has id = bar
// and replace it with the following route path
weaveById("bar").replace().multicast().to("mock:a").to("mock:b");
}
});
注意,文档中说您需要覆盖 isAdviceWith 方法并手动启动和停止 camelContext。
如果您运行遇到问题,请告诉我们。开始时可能有点棘手,但一旦掌握了它,模拟响应实际上非常强大。
下面是一个在执行 adviceWith.. 时将正文添加到简单表达式的示例
context.getRouteDefinition("yourRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
weaveById("yourEndpointId").replace().setBody(new ConstantExpression("whateveryouwant"
));
}
});
我的服务中有以下路线:
public void configure() {
/*
* Scheduled Camel route to produce a monthly report from the audit table.
* This is scheduled to run the first day of every month.
*/
// @formatter:off
from(reportUri)
.routeId("monthly-report-route")
.log("Audit report processing started...")
.to("mybatis:updateProcessControl?statementType=Update")
.choice()
/*
* If the rows updated is 1, this service instance wins and can run the report.
* If the rows updated is zero, go to sleep and wait for the next scheduled run.
*/
.when(header("CamelMyBatisResult").isEqualTo(1))
.process(reportDateProcessor)
.to("mybatis:selectReport?statementType=SelectList&consumer.routeEmptyResultSet=true")
.process(new ReportProcessor())
.to("smtp://smtpin.tilg.com?to="
+ emailToAddr
+ "&from=" + emailFromAddr )
.id("RecipientList_ReportEmail")
.endChoice()
.end();
// @formatter:on
}
当我尝试 运行 对此进行测试时,它给了我一个错误,指出 camel 无法自动创建组件 mybatis。我对测试骆驼路线没有经验,所以我不确定该去哪里。第一个 mybatis 调用更新了 table 中的一行,它没有被测试所以我想做一些事情,比如当端点被击中时,return CamelMyBatisResult header 有一个值1. 第二个 mybatis 端点应该 return 一个 hashmap(第一次测试为空,第二次测试为空)。我如何着手实施一种 when/then 类型的骆驼测试机制?我看过模拟端点骆驼文档,但我无法弄清楚如何应用它并将它return作为交换的值,然后继续路由(测试的最终结果是检查发送带或不带附件的电子邮件)
编辑:尝试同时使用 replace().set* 方法并将 mybatis 端点替换为对内联处理器的调用:
@Test
public void test_reportRoute_NoResultsFound_EmailSent() throws Exception {
List<AuditLog> bodyList = new ArrayList<>();
context.getRouteDefinition("monthly-report-route").adviceWith(context,
new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
replaceFromWith(TEST);
weaveById("updateProcControl").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader("CamelMyBatisResult", 1);
}
});
weaveById("selectReport").replace()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody(bodyList);
}
});
weaveById("RecipientList_reportEmail").replace()
.to("smtp://localhost:8083"
+"?to=" + "test@test.com"
+"&from=" + "test1@test1.com");
}
});
ProducerTemplate prod = context.createProducerTemplate();
prod.send(TEST, exch);
assertThat(exch.getIn().getHeader("CamelMyBatisResult"), is(1));
assertThat(exch.getIn().getBody(), is(""));
}
到目前为止,header 仍然是 null,body(TEST 变量是直接分量)
如果您想输入硬编码响应,在您的路线上执行 adviceWith 会更容易。看这里:http://camel.apache.org/advicewith.html
基本上,为每个端点添加一个 id 或 .to()
。然后你的测试执行一个 adviceWith 然后用一些硬编码的响应替换那个 .to() 。它可以是地图、字符串或您想要的任何其他内容,它将被替换。例如:
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// weave the node in the route which has id = bar
// and replace it with the following route path
weaveById("bar").replace().multicast().to("mock:a").to("mock:b");
}
});
注意,文档中说您需要覆盖 isAdviceWith 方法并手动启动和停止 camelContext。
如果您运行遇到问题,请告诉我们。开始时可能有点棘手,但一旦掌握了它,模拟响应实际上非常强大。
下面是一个在执行 adviceWith.. 时将正文添加到简单表达式的示例
context.getRouteDefinition("yourRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
weaveById("yourEndpointId").replace().setBody(new ConstantExpression("whateveryouwant"
));
}
});