我正在编写集成测试来测试现有的路由。获得响应的推荐方式如下所示(通过Camel In Action第 6.4.1 节):
public class TestGetClaim extends CamelTestSupport {
@Produce(uri = "seda:getClaimListStart")
protected ProducerTemplate producer;
@Test
public void testNormalClient() {
NotifyBuilder notify = new NotifyBuilder(context).whenDone(1).create();
producer.sendBody(new ClientRequestBean("TESTCLIENT", "Y", "A"));
boolean matches = notify.matches(5, TimeUnit.SECONDS);
assertTrue(matches);
BrowsableEndpoint be = context.getEndpoint("seda:getClaimListResponse", BrowsableEndpoint.class);
List<Exchange> list = be.getExchanges();
assertEquals(1, list.size());
System.out.println("***RESPONSE is type "+list.get(0).getIn().getBody().getClass().getName());
}
}
测试运行,但我什么也没得到。5assertTrue(matches)
秒超时后失败。
如果我将测试重写为如下所示,我会得到响应:
@Test
public void testNormalClient() {
producer.sendBody(new ClientRequestBean("TESTCLIENT", "Y", "A"));
Object resp = context.createConsumerTemplate().receiveBody("seda:getClaimListResponse");
System.out.println("***RESPONSE is type "+resp.getClass().getName());
}
文档对此有点了解,所以谁能告诉我第一种方法我做错了什么?改用第二种方法有什么问题吗?
谢谢。
更新 我已经对此进行了分解,看起来问题在于将seda作为起始端点与在路由中使用接收者列表相结合。我还更改了 NotifyBuilder 的构造(我指定了错误的端点)。
- 如果我将起始端点更改为 直接而不是seda,那么测试将起作用;或者
- 如果我注释掉收件人列表 ,那么测试将起作用。
这是重现此问题的 Route 的精简版本:
public class TestRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
// from("direct:start") //works
from("seda:start") //doesn't work
.recipientList(simple("exec:GetClaimList.bat?useStderrOnEmptyStdout=true&args=${body.client}"))
.to("seda:finish");
}
}
请注意,如果我将NotifyTest的源代码从“ Camel In Action ”源更改为具有这样的路由构建器,那么它也会失败。