Apache Camel MockEndpoint模拟输出

时间:2016-11-22 16:04:39

标签: java unit-testing mocking apache-camel

假设我有一条像这样的apache camel路线:

from("direct:start")
    .routeId("aRouteId")
    .bean(someBusinnessTransformationBean).id("transformationBean")
    .bean(aPersistenceBean).id("persistenceBean")
    .to("direct:target");

然后,在我的单元测试中,我正在做类似的事情:

public class RouteTest extends CamelTestSupport {
    @Override
    public boolean isDumpRouteCoverage() { return true }

    @Override
    public boolean isUsedAdviceWith() { return true }

    @EndpointInject(uri = "mock:mockTransformationBean")
    protected MockEndpoint mockTransformationBean;

    @EndpointInject(uri = "mock:mockPersistenceBean")
    protected MockEndpoint mockPersistenceBean;

    @Test
    public void testRoute() throws Exception {
        context.getRouteDefinition("aRouteId").adviceWith(context, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                weaveById("transformationBean")
                    .replace()
                    .multicast()
                    .to(mockTransformationBean);

                weaveById("persistenceBean")
                    .replace()
                    .multicast()
                    .to(mockPersistenceBean);
            }
        });

        context.start();

        // Asserts the expectedMessageCount

        // Send a message with template.sendBody...

        assertMockEndpointSatisfied();
    }
}

问题:

我怎样才能正确地测试这条路线,而不是仅仅确保messageCount和收到的主体(在第一个bean上)。

就像,我如何模仿MockEndpoint的响应,就像我在使用Mockito进行单元测试时所做的那样:

when(mockTransformationBean.someHandler(...)).thenReturn(anExpectedObjectForMyUnitTestPropose);

干杯,尼古拉斯

2 个答案:

答案 0 :(得分:3)

经过一些研究,文档阅读等,我想出了一个可接受的解决方案:

weaveById("transformationBean")
    .replace()
    .to(mockTransformationBean)
    .setBody(constant(<myExpectedMockResponse>));

所以稍后,我可以做一个断言:

mockPersistenceBean.expectedBodiesReceivedInAnyOrder(
    <myExpectedMockResponse>
);

这样,不仅可以确保bean和端点是否正在接收正确的主体/标头,还可以确保路由之间的任何转换也正确。

因此,可以从单元的角度测试代码的输入和输出,而不是将其与单元测试中不需要的许多其他组件集成。

答案 1 :(得分:0)

您可以单独构建交换并调用bean方法;也就是说,不要通过Camel发送它们 - 只需直接调用bean。这是一个更有控制和有针对性的单元测试。