如何使用将访问数据库的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> 

否则采取一个例子,你可以尝试使用DBUnit(设置测试数据库)或Mockito(以模拟DB调用的响应)

+1

DB单元测试的好解决方案。但是,对于其他一些豆类,可能很难模拟环境。我认为嘲笑这个豆是一个更好的方法。 – Javen 2012-01-19 08:42:53

+0

是的,我完全理解......如果你能使它与你的设置一起玩,Mockito真棒!否则,克劳斯会建议一些其他的方法(建议等),以及... ...祝你好运 – 2012-01-19 17:10:39

如果你的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的问题。

+0

所以我认为关键是将bean暴露在外面。何时进行单元测试,将模拟bean设置为测试路线。但有没有什么办法直接从骆驼上下文获取bean,并用模拟bean替换它?这样,我不需要修改当前路线,也不需要更多的字段和getter/setter。 – Javen 2012-01-19 08:50:25