如何在Camel Production Route单元测试中模拟Grails服务

时间:2012-08-27 11:30:35

标签: grails apache-camel

我需要在Grails中为生产路线编写单元测试,这些测试使用Camel bean组件引用的服务。我的要求既不是改变也不是在测试中复制现有路线。

问题是以某种方式模拟Service bean并将其添加到Camel注册表中。

我能够在'context.registry.registry'对象上使用'bind'方法完成此操作。有没有任何功能以更安全的方式做到这一点?骆驼版是2.10,Grails 2.1

路线是:

from('direct:validate').to('bean:camelService?method=echo')

CamelService只是简单的类:

package com

class CamelService {
    def echo(text) {
        println "text=$text"
        text
    }
}

测试如下(仅复制路线以使问题更简单):

package com

import grails.test.mixin.*
import org.apache.camel.builder.RouteBuilder
import org.apache.camel.test.junit4.CamelTestSupport

@TestFor(CamelService)
class RouteTests extends CamelTestSupport {

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from('direct:validate').to('bean:camelService?method=echo')
            }
        };
    }

    void testMockBean() throws Exception {
        context.registry.registry.bind 'camelService', service
        def result = template.requestBody('direct:validate', 'message')
        assert result != null
        assert result == 'message'
    }
}

2 个答案:

答案 0 :(得分:1)

Camel允许您插入所需的任何自定义注册表,开箱即用它使用基于Jndi的注册表,这就是您可以使用代码示例将服务绑定到它的原因。另一种方法是使用SimpleRegistry,它只是一个Map,因此您可以使用Map中的put方法将服务放入注册表中。然后,您需要覆盖CamelTestSupport类的createCamelContext方法 将SimpleRegistry传递给DefaultCamelContext的构造函数。

无论如何,只要您使用非Spring CamelTestSupport类,您的代码就是安全的,因为它使用基于JNDI的registrry开箱即用。如果您使用CamelSpringTestSupport,那么它是一个基于spring的注册表,您需要使用spring app context将bean添加到它。

答案 1 :(得分:0)

您可以使用CamelSpringtestSupport而不是CamelTestSupport作为基类注入组件。

阅读Spring Test上的文档将对您有所帮助,您可能会觉得在测试中使用mock非常有趣。

无论如何,您可以为测试构建自定义上下文,包含bean的声明并在测试中加载它。

public class RouteTests  extends CamelSpringTestSupport {

    @Override
    protected AbstractApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext("route-test-context.xml");
    }

    @Test
    public void testMockBean(){
         //...
    }
}

路由测试context.xml中

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://camel.apache.org/schema/cxf" xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://camel.apache.org/schema/spring 
     http://camel.apache.org/schema/spring/camel-spring.xsd">

     <bean id="service" ref="com.CamelService"/>
     <camelContext xmlns="http://camel.apache.org/schema/spring">
          <package>com</package>
     </camelContext>
</beans>