Apache Camel集成测试 - NotifyBuilder

时间:2010-11-11 01:28:26

标签: esb apache-camel

我正在编写集成测试来测试现有的路由。获得响应的推荐方法如下所示(通过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());
    }
}

测试运行但我什么也没收到。在{5秒超时后assertTrue(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 与路径中的 recipientList 结合使用作为起始端点。我也改变了NotifyBuilder的构造(我指定了错误的端点)。

  • 如果我将起始端点更改为 直接而不是 seda 然后测试将起作用;或
  • 如果我注释掉 recipientList 那么测试就可以了。

这是我的路线的精简版本,可以重现这个问题:

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 ”源更改为具有这样的路由构建器,那么它也会失败。

2 个答案:

答案 0 :(得分:2)

尝试在getEndpoint中使用“seda:getClaimListResponse”以确保端点uri是100%正确

答案 1 :(得分:0)

FWIW:似乎notifyBuilder与seda队列一起工作不太正常:一个测试类来说明:

public class NotifyBuilderTest extends CamelTestSupport {

// Try these out!
// String inputURI = "seda:foo";   // Fails
// String inputURI = "direct:foo"; // Passes

@Test
public void testNotifyBuilder() {

    NotifyBuilder b = new NotifyBuilder(context).from(inputURI)
            .whenExactlyCompleted(1).create();

    assertFalse( b.matches() );
    template.sendBody(inputURI, "Test");
    assertTrue( b.matches() );

    b.reset();

    assertFalse( b.matches() );
    template.sendBody(inputURI, "Test2");
    assertTrue( b.matches() );
}

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from(inputURI).to("mock:foo");
        }
    };
}
}