如何在骆驼中对石英进行单元测试
How to unit test quartz in camel
我在弄清楚如何测试在 from
中使用 quartz
的路线时遇到问题
我的 spring
文件
<spring:route id="metricExtractionTimer" startupOrder="1">
<spring:from uri="quartz://metricExtractionTimer?fireNow=true"/>
<transform>
<simple>........... Object Added to DB ...........</simple>
</transform>
<to uri="stream:out"/>
<to uri="mock:result"/>
</spring:route>
我的测试文件
@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration(locations = "/beans-test.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class MetricExtractionTest{
@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;
@Produce(uri = "quartz://metricExtractionTimer?fireNow=true")
protected ProducerTemplate producerTemplate;
@Test
public void testQuartzCron() throws Exception {
producerTemplate.sendBody(null);
}
}
异常:
Caused by: org.apache.camel.FailedToStartRouteException: Failed to start route metricExtractionTimer because of startupOrder clash. Route quartz already has startupOrder 1 configured which this route have as well. Please correct startupOrder to be unique among all your routes.
at org.apache.camel.impl.DefaultCamelContext.doCheckStartupOrderClash(DefaultCamelContext.java:3414)
at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3364)
at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3147)
at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3003)
at org.apache.camel.impl.DefaultCamelContext.access[=12=]0(DefaultCamelContext.java:172)
at org.apache.camel.impl.DefaultCamelContext.call(DefaultCamelContext.java:2799)
at org.apache.camel.impl.DefaultCamelContext.call(DefaultCamelContext.java:2795)
at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2818)
at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2795)
at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2764)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.execute(CamelSpringTestContextLoader.java:515)
at org.apache.camel.test.spring.CamelSpringTestHelper.doToSpringCamelContexts(CamelSpringTestHelper.java:92)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.handleCamelContextStartup(CamelSpringTestContextLoader.java:509)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.loadContext(CamelSpringTestContextLoader.java:164)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.loadContext(CamelSpringTestContextLoader.java:87)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
... 28 more
看起来 Camel 在手动触发 self-triggering 路由时遇到了麻烦,这是可以理解的。另外,你真的不想测试 Camel Quartz 模块,因为这已经很好地测试了 open-source 代码。
我建议你将 quartz 路由调用 sub-route 和 direct:yourRouteName consumer。然后可以从你的单元测试中顺利调用那个。
Also, you don't really want to test the Camel Quartz module, since this already well tested open-source code.
不同意这种说法。通过这种推理,我们也不应该测试我们与其他框架的交互,例如Spring、Hibernate、Camel 等
@Bilal:最好的办法是查看 camel-quartz2 项目如何测试自身 [1]。
具体可以看[2]和[3]。
[1] https://github.com/apache/camel/tree/master/components/camel-quartz2/src/test
举个例子:
@Component
public class MyRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("quartz2://myGroup/myTimerName?cron=0/2+*+*+*+*+?")
.to("mock:result");
}
}
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
public class MyRouteTest {
@Autowired
private CamelContext camelContext;
@EndpointInject(uri = "mock:result")
private MockEndpoint resultEndpoint;
@Test
public void testRoute() throws Exception {
resultEndpoint.expectedMinimumMessageCount(3);
MockEndpoint.assertIsSatisfied(camelContext);
}
}
我在弄清楚如何测试在 from
中使用 quartz
的路线时遇到问题
我的 spring
文件
<spring:route id="metricExtractionTimer" startupOrder="1">
<spring:from uri="quartz://metricExtractionTimer?fireNow=true"/>
<transform>
<simple>........... Object Added to DB ...........</simple>
</transform>
<to uri="stream:out"/>
<to uri="mock:result"/>
</spring:route>
我的测试文件
@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration(locations = "/beans-test.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class MetricExtractionTest{
@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;
@Produce(uri = "quartz://metricExtractionTimer?fireNow=true")
protected ProducerTemplate producerTemplate;
@Test
public void testQuartzCron() throws Exception {
producerTemplate.sendBody(null);
}
}
异常:
Caused by: org.apache.camel.FailedToStartRouteException: Failed to start route metricExtractionTimer because of startupOrder clash. Route quartz already has startupOrder 1 configured which this route have as well. Please correct startupOrder to be unique among all your routes.
at org.apache.camel.impl.DefaultCamelContext.doCheckStartupOrderClash(DefaultCamelContext.java:3414)
at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3364)
at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3147)
at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3003)
at org.apache.camel.impl.DefaultCamelContext.access[=12=]0(DefaultCamelContext.java:172)
at org.apache.camel.impl.DefaultCamelContext.call(DefaultCamelContext.java:2799)
at org.apache.camel.impl.DefaultCamelContext.call(DefaultCamelContext.java:2795)
at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2818)
at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2795)
at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2764)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.execute(CamelSpringTestContextLoader.java:515)
at org.apache.camel.test.spring.CamelSpringTestHelper.doToSpringCamelContexts(CamelSpringTestHelper.java:92)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.handleCamelContextStartup(CamelSpringTestContextLoader.java:509)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.loadContext(CamelSpringTestContextLoader.java:164)
at org.apache.camel.test.spring.CamelSpringTestContextLoader.loadContext(CamelSpringTestContextLoader.java:87)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
... 28 more
看起来 Camel 在手动触发 self-triggering 路由时遇到了麻烦,这是可以理解的。另外,你真的不想测试 Camel Quartz 模块,因为这已经很好地测试了 open-source 代码。
我建议你将 quartz 路由调用 sub-route 和 direct:yourRouteName consumer。然后可以从你的单元测试中顺利调用那个。
Also, you don't really want to test the Camel Quartz module, since this already well tested open-source code.
不同意这种说法。通过这种推理,我们也不应该测试我们与其他框架的交互,例如Spring、Hibernate、Camel 等
@Bilal:最好的办法是查看 camel-quartz2 项目如何测试自身 [1]。
具体可以看[2]和[3]。
[1] https://github.com/apache/camel/tree/master/components/camel-quartz2/src/test
举个例子:
@Component
public class MyRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("quartz2://myGroup/myTimerName?cron=0/2+*+*+*+*+?")
.to("mock:result");
}
}
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
public class MyRouteTest {
@Autowired
private CamelContext camelContext;
@EndpointInject(uri = "mock:result")
private MockEndpoint resultEndpoint;
@Test
public void testRoute() throws Exception {
resultEndpoint.expectedMinimumMessageCount(3);
MockEndpoint.assertIsSatisfied(camelContext);
}
}