我需要在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'
}
}
答案 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>