如何使用将访问数据库的bean单元测试路由?
这里DB就是一个例子。这意味着在单元测试环境中无法做好准备。如何使用将访问数据库的bean单元测试路由?
考虑下面的路线:
DBBean dbBean = new DBBean();
from("direct:test").bean(dbBean).to("direct:someOtherLogic");
在做单元测试,有没有什么方法来嘲笑“dbBean”?在单元测试中,很难建立真实的数据库。
感谢您的帮助。
骆驼有一个测试工具包,它允许您在测试之前操作路线。然后,您可以保持路线不变,然后替换部分路线,以及不要的路线。它有点详细,它的文档作为建议与功能在这里:http://camel.apache.org/advicewith.html
它通常工作更容易,如果EIPs分配ID,因为你可以然后引用这些ID,并用其他东西替换它。
但是,如果你知道你要替换你可以做第一的BeanDefinition:
weaveByType(BeanDefinition.class).selectFirst().replace().to("mock:dbBean");
见上面的链接如何在骆驼测试工具包的建议,使用这项功能(如骆驼测试)JAR。
请注意,建议您告诉骆驼检测试剂盒您正在使用建议,您将按照该链接底部所记录的方式进行操作。
您可以使用嵌入式数据库(DERBY等)...这里是从camel-jdbc unit test
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="timer://kickoff?period=10000"/>
<setBody>
<constant>select * from customer</constant>
</setBody>
<to uri="jdbc:testdb"/>
<to uri="mock:result"/>
</route>
</camelContext>
<!-- Just add a demo to show how to bind a date source for camel in Spring-->
<jdbc:embedded-database id="testdb" type="DERBY">
<jdbc:script location="classpath:sql/init.sql"/>
</jdbc:embedded-database>
如果你的DbBean是一个接口,那么你可以有2个不同的实现。一个用于真正的数据库工作。还有其他用于模拟单元测试的模拟数据库。
那么它只是在你的单元测试
DbBean db = new MockDbBean()
由于它只是普通的Java代码实例化一个模拟的问题。您可以在RouteBuilder类具有的getter/setter
public class MyRouteBuilder extends RouteBuilder {
private DbBean dbBean;
// getter/setter for dbBean
public void configure() throws Exception {
from("direct:test").bean(dbBean).to("direct:someOtherLogic");
}
}
然后从单元测试它只是用在MyRouteBuilder例如一个setter设置MockDbBean的问题。
所以我认为关键是将bean暴露在外面。何时进行单元测试,将模拟bean设置为测试路线。但有没有什么办法直接从骆驼上下文获取bean,并用模拟bean替换它?这样,我不需要修改当前路线,也不需要更多的字段和getter/setter。 – Javen 2012-01-19 08:50:25
DB单元测试的好解决方案。但是,对于其他一些豆类,可能很难模拟环境。我认为嘲笑这个豆是一个更好的方法。 – Javen 2012-01-19 08:42:53
是的,我完全理解......如果你能使它与你的设置一起玩,Mockito真棒!否则,克劳斯会建议一些其他的方法(建议等),以及... ...祝你好运 – 2012-01-19 17:10:39