如何对访问数据库的Bean进行路由单元测试?

5

在这里,DB只是一个示例。它意味着一些东西无法在单元测试环境中准备。

考虑下面的路由:

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

当进行单元测试时,有没有一种方法可以模拟“dbBean”?在单元测试中,很难设置真实的数据库。谢谢你的帮助。
3个回答

3
骆驼框架有一个测试工具包,它允许您在测试之前操纵路线。然后您可以保持路线不变,并替换路线的部分等等。这有点复杂,它在此处作为advice-with功能记录下来:http://camel.apache.org/advicewith.html 通常情况下,如果EIPs(企业集成模式)已分配ID,则更容易使用,因为您可以引用这些ID并将其替换为其他内容。
但是,如果您知道要替换第一个BeanDefinition,则可以执行以下操作:
weaveByType(BeanDefinition.class).selectFirst().replace().to("mock:dbBean");

请查看上述链接以了解如何在Camel测试工具包(例如camel-test)JAR中使用advice-with。

请注意,建议告诉Camel测试工具包您正在使用advice with,方法如底部链接所述。


2
你可以使用嵌入式数据库(DERBY等)...这里是一个示例,取自camel-jdbc单元测试
<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(模拟对数据库调用的响应)。

1
好的解决方案用于数据库单元测试。然而,对于其他一些bean,模拟环境可能会很困难。我认为模拟bean是更好的方法。 - Javen
是的,我完全理解了...如果你能让Mockito适应你的设置,它就非常棒...否则,Claus建议使用其他方法(如advicewith等)也可以...祝你好运。 - Ben ODay

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即可。


所以我认为关键是将bean暴露在路由之外。进行单元测试时,将模拟bean设置到被测试的路由中。但是有没有办法直接从Camel上下文中获取bean并用模拟bean替换它?这样,我就不需要修改当前路由,也不需要更多的字段和getter/setter。 - Javen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接