在Camel路由测试的注册表中找不到模拟

时间:2016-12-10 01:11:10

标签: apache-camel

我正在尝试测试包含

的Camel路由(从SQS队列轮询消息)
.bean("messageParserProcessor") 

其中messageParserProcessor是处理器。
测试:

public class SomeTest extends CamelTestSupport {

    private final String queueName = ...;
    private final String producerTemplateUri = "aws-sqs://" + queueName + ...;

    private static final String MESSAGE_PARSER_PROCESSOR_MOCK_ENDPOINT = "mock:messageParserProcessor";

    @EndpointInject(uri = MESSAGE_PARSER_PROCESSOR_MOCK_ENDPOINT)
    protected MockEndpoint messageParserProcessor;

    @Override
    public boolean isUseAdviceWith() {
        return true;
    }

    @Before
    public void setUpContext() throws Exception {
        context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                interceptSendToEndpoint("bean:messageParserProcessor")
                    .skipSendToOriginalEndpoint()
                    .process(MESSAGE_PARSER_PROCESSOR_MOCK_ENDPOINT);
            }
        });
    }

    @Test
    public void testParser() throws Exception {
        context.start();
        String expectedBody = "test";

        messageParserProcessor.expectedBodiesReceived(expectedBody);

        ProducerTemplate template = context.createProducerTemplate();
        template.sendBody(producerTemplateUri, expectedBody);

        messageParserProcessor.assertIsSatisfied();
        context.stop();
    }
}

当我运行测试时,我收到此错误:

org.apache.camel.FailedToCreateRouteException:
Failed to create route route1 at:
>>> InterceptSendToEndpoint[bean:messageParserProcessor -> [process[ref:mock:messageParserProcessor]]] <<< in route: Route(route1)[[From[aws-sqs://xxx... 
because of No bean could be found in the registry for: mock:messageParserProcessor of type: org.apache.camel.Processor

如果我将interceptSendToEndpoint(...)替换为mockEndpointsAndSkip("bean:messageParserProcessor")

,则会出现同样的错误

当我不使用mock时,可以执行测试(但显然没有通过):

interceptSendToEndpoint("bean:messageParserProcessor")
    .skipSendToOriginalEndpoint()
    .process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {}
     });

所以问题是找不到的模拟,我创建它的方式有什么问题?

1 个答案:

答案 0 :(得分:0)

所以我找到了从注册表中检索模拟的解决方法:

interceptSendToEndpoint("bean:messageParserProcessor")
    .skipSendToOriginalEndpoint()
    .bean(getMockEndpoint(MESSAGE_PARSER_PROCESSOR_MOCK_ENDPOINT));
    // Instead of
    // .process(MESSAGE_PARSER_PROCESSOR_MOCK_ENDPOINT);

但我仍然不明白为什么使用.process("mock:someBean")不起作用......

相关问题