Apache驼峰如何测试回滚场景

时间:2015-10-14 06:34:24

标签: apache-camel

我有一个通用消息路由器,其路由由各种路由构建器根据某些配置在运行时创建。

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

这样的路由构建器的示例如下所示:

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之间移动消息和{{1终点。路由bean中有一些逻辑,根据消息内容帮助我们完成所有测试场景:

mock:test2

一切正常,我们非常高兴我们可以更改代码并立即对其进行测试。但是,我们的大多数航线建造商都将建造交易路线。从我们的集成和端到端测试中,我们知道事务处理功能运行良好,但能够通过单元测试在代码更改点进行测试会更好。

所以我的问题是:

使用与上面相同的路线并对其进行@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).transacted()端点的方法,因此我们可以将这部分功能覆盖为好。我们很高兴任何有关建议的工作只是为了证明这方面有效。

提前感谢您的意见。

更新1: 我尝试过的一件事就是使用注入了模拟jta事务管理器的direct:test来配置我的测试驼峰上下文。像bleow一样:

TransactionErrorHandler

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

更新2: 无法实现上述目标,我退后一步,开始将ActiveMQ作为交易资源集成到我的单元测试中,一切正常。实际上,我们的路由还包括文件和数据库端点,但出于单元测试的目的,仅使用JMS资源的通用队列构建器就足够了。我没有意识到,当你整天与Webshere MQ管理器交易时,你需要创建和配置MQ管理器并且你必须拥有队列以及你必须为此构建的所有重型基础架构,这是多么容易。 ActiveMQ做得非常好。

但是,我仍然会对是否有办法模仿这种跨国行为感兴趣。

0 个答案:

没有答案