这里DB只是一个例子。这意味着在单元测试环境中无法准备。
考虑以下路线:
DBBean dbBean = new DBBean();
from("direct:test").bean(dbBean).to("direct:someOtherLogic");
什么时候进行单元测试,有没有办法模拟'dbBean'?在单元测试中,很难建立真正的数据库。
感谢您的帮助。
答案 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>
答案 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。