用于pollEnrich的Camel模拟端点

1u4esq0p  于 2022-11-07  发布在  Apache
关注(0)|答案(3)|浏览(229)

我尝试为pollEnrich模拟端点,但没有成功。使用adviceWith进行模拟对.to("").enrich("")运行良好,但对于pollEnrich,我遇到了错误:
如果您的计算机出现异常,请单击“下一步”。连接到本地主机:8983*
我不明白为什么adviceWith不适合pollEnrich这是一段嘲弄的代码:

public class PollEnricherRefTest extends CamelTestSupport {

    public class SampleMockRoute extends RouteBuilder {

        public void configure() throws Exception {
            System.out.println("configure");
            from("direct:sampleInput")
                    .log("Received Message is ${body} and Headers are ${headers}")
                    //.to("http4://localhost:8983/test")
                    .pollEnrich("http4://localhost:8983/test", (exchange1, exchange2) -> {
                        return exchange1;
                    })
                    .log("after enrich ${body} ")
                    .to("mock:output");
        }
    }

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

    @BeforeEach
    public void beforeAll() throws Exception {
        AdviceWithRouteBuilder mockHttp4 = new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                interceptSendToEndpoint("http4://localhost:8983/test")
                        .log("call MOCK HTTP").skipSendToOriginalEndpoint();

            }
        };
        context = new DefaultCamelContext();
        context.addRoutes(new SampleMockRoute());
        context.getRouteDefinitions().get(0).adviceWith(context, mockHttp4);
        template = context.createProducerTemplate();
    }

    @Test
    public void sampleMockTest() throws InterruptedException {
        try {
            context.start();
            String expected = "Hello";
            MockEndpoint mock = getMockEndpoint("mock:output");
            mock.expectedBodiesReceived(expected);
            String input = "Hello";
            template.sendBody("direct:sampleInput", input);
            mock.assertIsSatisfied();
            context.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
uxh89sit

uxh89sit1#

您可以尝试在configure()中使用weavyByType。唯一的问题是它会将该路由中的所有pollEnrich模式替换为下面的mock url。如果您的路由中只有一个pollEnrich,这应该可以满足您的目的。
weaveById("myPollEnrichId").replace().to("mock:mock-url");
您也可以尝试在您的路由中为该特定pollEnrich设置一个id,如下所示。

.pollEnrich("http4://localhost:8983/test", (exchange1, exchange2) -> {
                        return exchange1;
                    }).id("myPollEnrichId")

完成后,您就可以使用weavyById来模拟特定的pollEnrich。
weaveById("myPollEnrichId").replace().to("mock:mock-url");

xqkwcwgp

xqkwcwgp2#

对于遇到被替换的路由不调用聚合策略这一问题的任何人:您可以将weaveByIdpollEnrich一起使用,但您还需要添加AggregationStrategy参数(请参见下文),否则它将不会调用该参数,因为它会将原始的pollEnrich替换为不包含该参数的另一个pollEnrich
首先:在configure方法中为原始pollEnrich添加一个id:

.pollEnrich("http4://localhost:8983/test", (exchange1, exchange2) -> {
                        return exchange1;
                    }).id("my-pollEnrich")

第二:在测试中,使用weaveById将其发送到一个设置了聚合策略的模拟路由:

AdviceWithRouteBuilder mockHttp4 = new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            weaveById("my-pollEnrich").replace().pollEnrich("mock:my-pollEnrich-mock", (exchange1, exchange2) -> {
                return exchange1;
            }).id("my-pollEnrich"); //set the same id, otherwise it won't find when executing "beforeEach" again

        }
};

如果您需要在路由中测试实际的聚合策略,最好的方法是为它创建一个单独的类,并在测试中重用它。

avkwfej4

avkwfej43#

您可以使用weaveBy替换pollEnrich ...有各种变体 weaveByTypeweaveById 等。
如果您使用 weaveByType,并且您的路线中有多个PollEnrich,您可以使用 selectFirst()selectLast() 等选择。
替换可以由另一个端点完成,例如模拟端点,但出于测试目的,我发现使用处理器并直接设置所需的交换内容很方便,或者在需要时保持不变。
下面是camel 3.5的代码示例

ModelCamelContext mcc = camelContext.adapt(ModelCamelContext.class);
        RouteReifier.adviceWith(mcc.getRouteDefinition("IdOfMyRoute"), mcc, new AdviceWithRouteBuilder() {
            @Override
            public void configure() {
                weaveByType(PollEnrichDefinition.class).selectFirst().replace().processor((exchange) -> {

});
            }
        });

相关问题