Apache camel Apache camel如何测试回滚场景

Apache camel Apache camel如何测试回滚场景,apache-camel,Apache Camel,我有一个通用的消息路由器,它的路由在运行时由不同的路由生成器根据一些配置创建 配置以XML形式存储,当加载到内存中时,它将转换为RouteConfig域对象,通过其getter公开如何构建路由。这样的RouteConfig将定义getFromUri()、getDestinations()、getDeadLetterUri()、IsTransact()等方法 此类管线生成器的示例如下所示: public class NonTransactedRouteBuilder extends Abstrac

我有一个通用的消息路由器,它的路由在运行时由不同的路由生成器根据一些配置创建

配置以XML形式存储,当加载到内存中时,它将转换为
RouteConfig
域对象,通过其getter公开如何构建路由。这样的
RouteConfig
将定义
getFromUri()、getDestinations()、getDeadLetterUri()、IsTransact()等方法

此类管线生成器的示例如下所示:

public class NonTransactedRouteBuilder extends AbstractRouteBuilder {
    @Override
    protected void buildRoute(String endPoint, RouteConfig routeConfig) {
        RouteBean routeBean = getRouteBean(routeConfig.getBean());
        final String[] destinations = routeConfig.getDestinations();

        from(endPoint).routeId(createRouteId())
                .autoStartup(false)
                .threads(routeConfig.getThreads())
                .filter(body().isNotNull())
                .process((Processor) routeBean)
                .filter(body().isNotNull())
                .choice()
                    .when(header("dead.letter").isNotNull())
                        .to(getDeadLetterUri())
                    .otherwise()
                        .loadBalance().random()
                        .to(destinations)
                .endChoice();
    }
}
以上只是一个示例,让您了解我们构建的路线类型。唯一相关的一件事是路线没有交易。现在,为了进行单元测试,我们扩展了CamelTestSupport的TestNG风格,并传递了一个模拟RouteConfig实例,该实例将导致一个路由被配置为在一个
direct:test
和两个
mock:test1
mock:test2
端点之间移动消息。路由bean中有一些逻辑,根据消息内容,它可以帮助我们进行所有测试场景:

@Test
public void shouldDiscardNullMessages() throws Exception {
    ...
}

@Test
public void shouldDiscardScamMessages() throws Exception {
    ...
}

@Test
public void shouldRouteMessageToDeadLetterQueue() throws Exception {
    ...
}

@Test(timeOut = 1000)
public void shouldRouteMessagesInALoadBalancedWay()
    ...
}
一切都很好,我们很高兴我们可以进行代码更改并立即进行测试。然而,我们的大多数路线建设者将建立交易路线。从我们的集成和端到端测试中,我们知道事务处理功能可以很好地工作,但是如果能够在代码更改点使用单元测试来测试它,那就更好了

所以我的问题是:

使用与上述相同的路由,只需一个
autoStartup(false).transaction()
更改,这将是在发件人
direct:test
端点中获取消息的一种方式,因此我们也可以介绍这部分功能。我们会很高兴与任何工作周围的建议,只是为了证明这方面的工作

提前感谢您的投入

更新1: 我尝试过的一件事是使用注入了模拟jta事务管理器的
TransactionErrorHandler
配置我的测试骆驼上下文。有点像bleow:

@Test
public void shouldBeAbleToRollback() throws Exception {
    TransactionErrorHandlerBuilder errorHandlerBuilder = new TransactionErrorHandlerBuilder();
    errorHandlerBuilder.setTransactionManager(jtaTransactionManagerMock);
    context().setErrorHandlerBuilder(errorHandlerBuilder);
    template.sendBody(FROM_1, "rollback message");
    ...
}
然后我希望能够捕获一个
jtaTransactionManagerMock.rollback()
,但这并没有发生。Wat将是不工作的原因

更新2: 由于无法实现上述目标,我退后一步,开始在单元测试中将ActiveMQ集成为事务性资源,一切正常。实际上,我们的路由还包括文件和数据库端点,但为了单元测试的目的,仅使用JMS资源的通用队列生成器就足够了。我没有意识到,如果你整天都在处理WebSphere MQ manager,你需要创建和配置MQ manager,而且你必须已经有了队列,并且必须为此构建所有繁重的基础设施,那么这会有多么容易。ActiveMQ做得非常好

然而,我仍然对是否有办法嘲笑这种跨国行为感兴趣