Apache 骆驼测试。删除 RoutePolicy

Apache Camel tesing. Remove RoutePolicy

这是 Apache Camel 路由:

ZooKeeperRoutePolicy routePolicy = new ZooKeeperRoutePolicy("zookeeper:localhost:2181/fuse-example/routePolicy", 1);
from("file:camelInpit").routeId("systemARoute")
                .routePolicy(routePolicy)
                .log(LoggingLevel.ERROR, "Starting route")
                [...]

我想在我的测试中删除 routePolicy,因为在测试环境中没有 ZooKeeper,但这并不像看起来那么容易

    context.getRouteDefinition("systemARoute").adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            replaceFromWith("direct:aaa");
            weaveByType(RouteDefinition.class).selectIndex(1).remove();
        }
    });

weaveById("policy") 并设置 id routePolicy(...).id("policy") 没有帮助。

如何在测试时动态删除 RoutePolicies

难道不能做这样的事情吗?

from("file:camelInpit").routeId("systemARoute")
                .choice()
                  .when(prodEnvironmentExpression)
                    .routePolicy(routePolicy)
                  .endChoice()
                .end()
                .log(LoggingLevel.ERROR, "Starting route")

如果将其绑定到上下文,则可以通过使用轻松地在测试中模拟策略,其中 myPolicy 是模拟或不执行任何操作的策略。

如果你创建一个抽象的 MyCamelTestSupport 覆盖它然后你所有需要模拟它的测试扩展 MyCamelTestSupport

@Override
protected JndiRegistry createRegistry() throws Exception {
    JndiRegistry jndi = super.createRegistry();
    jndi.bind("myPolicy", myPolicy);
    return jndi;
}

您可以访问原始路由并将其路由策略设置为空

    context.getRouteDefinition("systemARoute").adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            getOriginalRoute().setRoutePolicies(null);
        }
    });

但是我们也许应该为此添加流畅的 DSL 构建器以使其脱颖而出?