如何使用将访问DB的bean对路由进行单元测试?

时间:2012-01-19 01:16:37

标签: java apache-camel

这里DB只是一个例子。这意味着在单元测试环境中无法准备。

考虑以下路线:

DBBean dbBean = new DBBean();
from("direct:test").bean(dbBean).to("direct:someOtherLogic");

什么时候进行单元测试,有没有办法模拟'dbBean'?在单元测试中,很难建立真正的数据库。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

Camel有一个测试工具包,可让您在测试前操作路线。然后你可以保持路线不变,然后替换部分路线,以及诸如此类的东西。它有点精细,并在此处记录为建议 - 功能:http://camel.apache.org/advicewith.html

如果EIP分配了ID,通常会更容易,因为您可以引用这些ID,并将其替换为其他内容。

但是,如果您知道要替换第一个BeanDefinition,则可以执行以下操作:

weaveByType(BeanDefinition.class).selectFirst().replace().to("mock:dbBean");

请参阅上面的链接,了解如何在Camel Test Kit(例如驼峰测试)JAR中使用advice-with。

请注意,建议您告诉Camel Test Kit您正在使用建议,并按照该链接底部的说明进行操作。

答案 1 :(得分:2)

你可以使用嵌入式数据库(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(模拟数据库调用的响应)

答案 2 :(得分:1)

如果您的DbBean是一个接口,那么您可以有两种不同的实现。一个用于真正的数据库工作。还有其他用于模拟单元测试的模拟数据库。

然后它只是在你的单元测试中实例化一个模拟

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。

相关问题